RTTI是指在运行时,确切的识别一个对象的类型,并且所有的类型转换都在运行时进行正确性的检查。
也可以这么说:当只有一个指向对象基类的引用时RTTI机制可以让你找到这个对象的确切概念.
RTTI主要主要针对对象:Class对象。Class对象存放着对应类所需要的所有的类型信息,包括类的变量,类的属性,类的超类,类实现的借口,类的修饰符,类的对应的类的加载器等等
所有类都在第一次使用时,动态加载入jvm当中,当程序创建对类的第一个静态引用时,就会加载这个类,同时构造器可以看作是一个静态方法。
jvm是动态加载的,你需要什么我给你加载什么,这样的话,类加载器第一次使用该类时,他会检查这个类的class对象,有没有被加载,如果没有加载,就载入这个class对象,加载时需要对class文件验证,包括文件头,文件大小,文件内容语义检查,各类字符串引用检查等等,载入后,还有链接和初始化等两个步骤。
常常初始化行为被延迟到了对静态方法或者非常量静态域进行首次引用时才被执行。对于常量静态域是因为他在编译器的时候,已经被搞定了。
Class对象的获得有三种形式:
package test;
public class MyClass {
public static void main(String[] args) {
/**
* 第一种
*
* 这个方法把类加载器的第三步骤初始化一起做掉了
*
* 它的重载方法可以指定是不是进行初始化
*
* Class.forName(name, initialize, loader);
*/
try {
Class.forName("test.MyClass");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 第二种
*
* 这个方法不会把类加载器的第三步骤初始化做掉
*
* 这个延时到后面必要的时候进初始化
*/
Class<MyClass> class2 = MyClass.class;
/**
* 第三种
*/
MyClass myClass = new MyClass();
Class<? extends MyClass> class3 = myClass.getClass();
}
}
Class对象有一个newInstance()方法,可以看作是虚拟构造器,虚拟构造器可以正确的创建出确切的类型,使用这个方法对应的类必须有无参构造器
此外RTTI的表现形式有:
1.进行类型转换,这个主要是进行向下类型转换时使用,可以概括为:你是什么类型就可以从基类型转化什么类型,不是的话就不行了鸟,什么东西不是你的你不能强迫啊
2 通过查询class对象可以获取运行时的所需的信息
此外RTTI要处理的类在编译器都必须已知的,换句话说大家都是好人,只是我是游击队,你是八路,他是地下党而已