本文共 845 字,大约阅读时间需要 2 分钟。
RTTI: run time type information/Identification ,运行时类型信息或者运行时类型标识。
从它本身的定义上来说,它的使用范围是在程序运行时,有别于大多数的静态类型编译。
在运行时需要确定对象类型的情景主要有反射,父类对象与子类对象之间转型,接口和实现类之间的转型这三种情况。
什么时候RTTI开始工作呢?
JVM加载class文件是当程序需要这个文件的时候才会进行加载,可以认为是懒加载的处理方式进行加载的。加载是通过Class这个东东进行加载的,这里面有大量处理RTTI的方法,例如:
Class.forName("MyClass");加载进JVM的情况主要有以下几种:
第一:类的静态方法被调用,包括构造函数
特别的当默认构造方法被自定义带参数的构造方法代替,却引用默认构造函数进行加载的时候,会加载失败
第二种:类的静态属性属性被引用
第三种:上面提到的用Class.forName()进行加载的时候
如果提供的路径错误会产生类未找到异常。
第四种:反射的一些情况中会加载。
如果没有在反射的时候创建对象,仅仅只是获取类的属性和方法的信息,JVM是不会进行加载的。
RTTI在java中是很好理解的,总体上来讲,只要是涉及到类型转换的都会使用RTTI来获取类型信息。
在使用泛型的时候,RTTI是它坚实的基础,因为泛型涉及到了大量的类型转换。
当使用类型转换的时候,需要进行判断当前对象是不是某种类型,可以使用instanceof或者cast在强制转型之前进行判断。
这两种转换判断具体使用可以查找一下资料。
曾经在工作中遇到一个非常古怪的关于这个地方的问题:
在大型程序中,使用debug模式下进行调试启动,启动完成进行debug的时候,因为可能程序非常卡,报出了一个类未加载的异常。与之对应的是在正常启动非debug模式下,程序没有重现这个异常。最后的解决办法是在debug模式下加入Class.forName()进行加载没有加载的类。
转载地址:http://yepdi.baihongyu.com/