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;
- 包装类.TYPE
Class c = Integer.TYPE;
- 对象名.getClass()
String name="大力士";
Class c = name.getClass();
- Class类.getSuperClass()
Class c = String.TYPE. getSuperClass();
这里务必要注意,只有通过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());
}
}
图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)的完整名。