- RTTI is short for RunTime Type Information 。
- 三种方式
A.class
a.getClass()
Class.forName(A) - Class.forName(A),A要有完整的包名。
- Class的NewInstance()方法需要类有默认构造器。
- 建议使用.class的方式获取Class对象,简单,安全(编译时进行类型检查),高效(减少了方法调用)。
- 准备使用一个类的三步:
- 加载。ClassLoader将类的字节码加载到虚拟机然后创建class对象;
- 链接。为static field分配内存,解决对其他class的引用;
- 初始化,先父类,先静态。
引用静态方法(包括构造器,因为默认时静态的)或者静态成员变量(实际上应该是编译时常量)时触发初始化,但是如果静态常量(final static)不是编译时常量也会触发静态初始化。如
class A{ final static a=10;//使用a不触发A的静态初始化 final static aa=Random.nextInt();//使用aa会使A静态初始化 static{ //静态块 } }
- 泛型不支持协变和逆变,但是能实现协变和逆变,通过< ? extends A>和< ? super A>。
- 加了泛型的class在调用newInstance()的时候会返回精确类型二不是Object,但是< ? super A>依然返回Object,因为编译器无法推导出你要的是第几级父类。
- a.getSuperclass()返回的Class不能用A的直接父类引用,因为编译器不知道是第几级父类,同理该用Class< ? super A>。
- A.class.cast(a)等价于(A)a。
- a instanceof A。
- facede设计模式为一个复杂子系统提供一个简单接口。Façade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。
- instanceof/i是Instance():是否是该类或者该类的父类(的父类的…);==/equals():是否是该类。
- 不管你怎么努力,反射总有办法调用类中的方法:包括但不限于callHiddenMethod(),invoke()。
RTTI学习笔记
最新推荐文章于 2025-07-10 16:31:15 发布