运行时类型信息(RTTI)的作用
通过运行时类型信息可以在程序运行时使用类型信息,这一特性使程序员从只能在编译期执行面向类型的操作中解脱出来,从而可以构建更加强大的程序。
Class对象
类的运行时类型信息由Class对象表示的,每个类都有一个Class对象,每当编写并编译一个新类,就会产生一个Class对象。
Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.
Class类没有构造器,当某个类被加载时,这个类的Class对象由虚拟机自动创建。
反射
Class类与java.lang.reflect类一起实现了Java的反射,reflect类库包含了Field、Method以及Constructor类(都实现了Member接口)、这些类型的对象是由JVM在运行时创建的,用以表示未知类对应的成员。可以通过Constructor创建新的对象,用get()和set()方法读取和修改与Field对象关联的字段,用invoke()方法调用与Method对象关联的字段,还可以调用getField()、getMethod()和getConstructor()返回字段、方法以及构造器的数组。这样匿名对象的类信息就能在运行时被确定下来,在编译期不需要知道任何信息。
当通过反射与一个未知类型的对象打交道时,JVM只是简单地检查这个对象,看它属于哪个特定的类(与RTTI一样)。RTTI与反射之间的区别只在于:对RTTI来说,编译器在编译时打开和检查.class文件,可以用普通方式调用对象的所有方法;而对于反射机制来说,.Class文件在编译时是不可获取的,只能在运行时打开和检查.class 文件。
参考资料
- 《Java编程思想(第五版)》
- Java Doc