RTTI和反射机制

RTTI(run-time type indentfication)应该是所谓“传统的RTTI”。《Thinking in JAVA》上说JAVA的RTTI包括2种方式:传统的RTTI和反射,但感觉反射才是真正的“运行时”检查,而传统的是“静态”类型检查。因为传统的RTTI有3种形式,分别是upcasting and downcasting,literals以及instanceof或isInstance(),这些都是在编译时检查的,也就是要求在编译时,JVM就必须能访问到类的.class文件,我认为这根本不是运行时检查而是编译时检查。而Reflection是在运行时检查.class;比如:Class c = Class.forName("XXX");即时根本没有XXX这个类,编译时也不会报错,也就是说在编译时,JVM并没有打开XXX.class;但是如果是:Class c = XXX.class;同样没有XXX的情况下就会报错,说明JVM在编译阶段试图打开XXX.class,这是RTTI的一种形式。if(obj instanceof XXX) {...}也是一样会报错,向上向下转型更不用说了。RTTI可以对对象直接操作,可以直接进行方法调用,也就是类的方法是已知的;而对于反射而言,.class在运行时才可访问,因此对于方法的调用只能通过反射API进行。

你可能感兴趣的:(反射机制)