5.2 Class类

  在JDK中,java.lang.reflect包提供了类和接口,以获得关于类和对象的反射信息。反射机制允许通过编程,访问关于加载类的属性、方法和构造方法的信息,并允许使用反射对属性、方法和构造方法进行操作。java.lang包中的Class类和java.lang.reflect包中的Method类、Field类、Constructor类、Array类将是本章重点介绍的内容。

5.2.1 Class类概述

  与多数反射机制用到的类不同,Class类在java.lang包中,不在java.lang.reflect包中。Class类继承自Object类,是Java反射机制的入口,封装了一个类或接口的运行时信息,通过调用Class类的方法可以获取这些信息。例如刚才的例子,通过getDeclaredMethods()方法获取类所有方法。下面列举了获取Class类的几种方法。

  • Class.forName()

Class c = Class.forName("java.lang.Object");

  • 类名.class
Class c = Car.class;
copy
  • 包装类.TYPE
Class c = Integer.TYPE;
copy
  • 对象名.getClass()
String name="大力士";

Class c = name.getClass();
copy
  • Class类.getSuperClass()
Class c = String.TYPE. getSuperClass();
copy

  这里务必要注意,只有通过Class类. getSuperClass()方法才能获得Class类的父类的Class对象,不能通过name.getSuperClass()获取name对象父类的Class对象。

  下面通过一个案例来演示如何通过以上几种方式获取Class类对象。程序运行结果如图5.3所示。

import java.lang.reflect.*;

public class TestClass{

   public static void main(String[] args) {

      //如果将被建模的类类型未知,用Class<?>表示

      Class<?> c1 = null;

      Class<?> c2 = null;

      Class<?> c3 = null;

      Class<?> c4 = null;

      Class<?> c5 = null;

      try{

         //建议采用这种形式

         c1 = Class.forName("java.lang.Object");

      }catch(Exception e){

​         e.printStackTrace();

      }

      c2 = new TestClass().getClass();

      c3 = TestClass.class;

      String name = new String("大力士");

      c4 = name.getClass();

      c5 = name.getClass().getSuperclass();

      System.out.println("Class.forName(\"java.lang.Object\") 类名称:" + c1.getName());

      System.out.println("new TestClass().getClass() 类名称:" + c2.getName());

      System.out.println("TestClass.class 类名称:" + c3.getName());

      System.out.println("String name = \"大力士\"");

      System.out.println("name.getClass() 类名称:" + c4.getName());

      System.out.println("name.getClass().getSuperclass() 类名称:" + c5.getName());

   }

}
copy
图5.3 获取Class类对象

5.2.2 Class类常用方法

  下面列举了Class类的一些常用方法,在本章的案例中,这些方法将会被频繁地使用。

  • Field[] getFields()

  返回一个包含Field对象的数组,存放该类或接口的所有可访问公共属性(含继承的公共属性)。

  • Field[] getDeclaredFields()

  返回一个包含Field对象的数组,存放该类或接口的所有属性(不含继承的属性)。

  • Field getField(String name)

  返回一个指定公共属性名的Field对象。

  • Method[] getMethods()

  返回一个包含Method对象的数组,存放该类或接口的所有可访问公共方法(含继承的公共方法)。

  • Method[] getDeclaredMethods()

  返回一个包含Method对象的数组,存放该类或接口的所有方法(不含继承的方法)。

  • Constructor[] getConstructors()

  返回一个包含Constructor对象的数组,存放该类的所有公共构造方法。

  • Constructor getConstructor(Class[] args)

  返回一个指定参数列表的Constructor对象。

  • Class[] getInterfaces()

  返回一个包含Class对象的数组,存放该类或接口实现的接口。

  • T newInstance()

  使用无参构造方法创建该类的一个新实例。

  • String getName()

  以String的形式返回该类(类、接口、数组类、基本类型或void)的完整名。