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
  1. Class c = Car.class;
  • 包装类.TYPE
  1. Class c = Integer.TYPE;
  • 对象名.getClass()
  1. String name="大力士";
  2. Class c = name.getClass();
  • Class类.getSuperClass()
  1. Class c = String.TYPE. getSuperClass();

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

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

  1. import java.lang.reflect.*;
  2. public class TestClass{
  3. public static void main(String[] args) {
  4. //如果将被建模的类类型未知,用Class<?>表示
  5. Class<?> c1 = null;
  6. Class<?> c2 = null;
  7. Class<?> c3 = null;
  8. Class<?> c4 = null;
  9. Class<?> c5 = null;
  10. try{
  11. //建议采用这种形式
  12. c1 = Class.forName("java.lang.Object");
  13. }catch(Exception e){
  14. e.printStackTrace();
  15. }
  16. c2 = new TestClass().getClass();
  17. c3 = TestClass.class;
  18. String name = new String("大力士");
  19. c4 = name.getClass();
  20. c5 = name.getClass().getSuperclass();
  21. System.out.println("Class.forName(\"java.lang.Object\") 类名称:" + c1.getName());
  22. System.out.println("new TestClass().getClass() 类名称:" + c2.getName());
  23. System.out.println("TestClass.class 类名称:" + c3.getName());
  24. System.out.println("String name = \"大力士\"");
  25. System.out.println("name.getClass() 类名称:" + c4.getName());
  26. System.out.println("name.getClass().getSuperclass() 类名称:" + c5.getName());
  27. }
  28. }

5.2 Class类 - 图1


图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)的完整名。