要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的。这项工作是由称为Class对象的特殊对象完成的,它包含了与类有关的信息。
类是程序的一部分,每个类都有一个Class对象。每当编写并且编译了一个新类,就会产生一个Class对象。为了生成这个类的对象,运行这个程序的JVM将使用被称为“类加载器”的子系统。
所有的类都是在对其第一次使用时,动态加载到JVM中的。当程序创建第一个对类的静态引用时,就会加载这个类。这个证明构造器也是类的静态方法,即使在构造器之前没有使用static关键字。因此,使用new操作符创建类的新对象也会被当做是对类的静态成员的引用。
Java程序在它开始运行之前并非被完全加载,其各个部分是在必需时才加载的。
Class.forName(String str)
这个方法是Class类(所有Class对象都属于这个类)的一个static成员。Class对象和其他所有对象一样,允许我们获取并操作它的引用(这也就是类加载器的工作)。forName()是获取Class对象的引用的一种方法,返回的是对一个Class对象的引用。它有着“副作用”:如果这个类还没有被加载,加载它。
1.类字面常量
java提供了另一种方式来生成对Class对象的引用,即类字面常量。
People.class
它在编译器就会收到检查(因此不需要置于try块中)。
类字面常量不仅可以应用于普通的类,也可以应用于接口、数组以及基本数据类型。
注意,当使用“.class”来创建对Class对象的引用时,不会自动初始化该Class对象。为了使用类而做的准备包含三个步骤:
(1)加载,这是由类加载器来执行。
(2)链接。在链接阶段验证类中的字节码,为静态域分配存储空间,并且如果必需的话,将解析这个类创建的对其他类的所有引用。
(3)初始化。如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。
初始化被延迟到了对静态方法(构造器隐式地是静态的)或者非常数静态域进行首次引用时才执行。