一、描述(如何辩识型别)
- 传统的RTTI(run-time type identification,执行期型别辨识)机制,它假设你在编译期和执行期拥有所有型别信息
- reflection机制,允许你在执行期间找出和class相关的信息
二、为什么需要RTTI
- 多态
- 在执行期找出对象的型别
三、Class对象
- 每个class都有一个Class对象。
- 执行期间当你想要产生该class对象时,Java虚拟机会先检查该型别的Class对象是否已经被装载,如果尚未装载,JVM会根据名称找到.class文件并装载它。
- 装载的是Class对象
- 一旦某个型别的Class对象被装载内存,它就可以用来产生改型别的所有对象
- Class.forName("className");返回的是className相关联的Class对象,调用该方法会导致className的初始化(必须拥有无参构造方法(null构造方法))。该方法等同于:className.class;(外覆类[Boolean,Long等]都有一个名为TYPE的标准数据,用以产生一个与之相对应的Class对象)。
- 总之产生Class对象的reference之后,便可对其进行相关操作(有关具体操作可查看Class类源码或查看文档)
package soul.test.ch_12;
class Test { static{ System.out.println("This is static !"); } Test(){ System.out.println("This is Test() !"); } } //测试类 class Test_2 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ Object o=Class.forName("soul.test.ch_12.Test").newInstance(); } } //print: //This is static ! //This is Test() !
四、instanceof
- 只能它来比较具名型别,不能比较Class对象
- instanceof(isInstanceof)所表示的意义在于:“你就是这个class吗?或是其子类吗?”
- 使用==比较两个Class对象时:“正好就是这个型别吗”
五、总结
这里简单的对了解一下反射机制,以后用到时再系统的学习一下。