RTTI表示运行时识别一个 对象的类别。从容器中去除,元素会自动从Object转换到容器参数类型(运行时转变)。对于具体的类型可以用多态来实现。
Class对象(包含了与类有关的信息)表示了类型信息在运行时的内容。
每编写并编译一个心累就会产生一个Class对象(被保存到.class文件中)。
生成Class对象需要JVM调用称为类加载器的子系统(包含一条类加载链)。所有的类都在第一次使用时,动态加载到jvm
Class中forname()是一个static成员,输入类名,返回Class对象的引用。Class用.newInstance()产生对象。该方法实现了虚拟构造器。
用newInstance方法创建的类必须带有默认构造器。
还有一个生成Class对象的引用即使用类字面常量(类名.class),在编译期会受到检查。
对于基本数据类型的包装器类,则用.TYPE来表示类字面常量
使用.class来创建Class对象的引用时,不会自动初始化该对象,这与forname方法不同
使用类的三个步骤:
1、加载。由类加载器执行; 2、链接。为静态域分配存储空间; 3、初始化
P319程序介绍.class,forname以及正常static的初始化顺序。其中.class初始化滞后,先进行调用,再初始化
在<>中的参数类型使用?即放宽要求,勇勇指向的范围变宽。一般在RTTI和反射得到的类对象都声明为Class<?>
想Class引用添加泛型的原因是为了提高编译期类型检查
在泛型语法中,若手头的是超类,那编译器将只允许你声明超类引用时“某个类,是一个类的超类”,而不是具体的类
RTTI有3种: 1、传统的类型转换; 2、代表对象的类型的Class对象; 3、instanceof(是否是某类的实例)
instanceof方法只与命名类型比较,不能与类对象比较。
isInstance方法提供动态测试对象的途径。getClass方法产生Class对象
反射提供一种机制,用来检查可用的方法,并返回方法。
反射是在运行状态中,对任意一个类,都能知道该类的所有属性和方法;对任意一个对象,都能调用它的任意一个方法和属性。
反射机制的作用:1、在运行时判断任一对象所属的类; 2、在运行时构造任一类的对象; 3、在运行时判断任一类所具有的成员变量和方法; 4、在运行时调用任意一个对象的方法; 5、生成动态代理
RTTI和反射真正的区别在于:前者编译器是在编译时打开和检查.class文件;而后者是在运行时才执行
设计模式未看
interface关键字一个重要的目标是允许程序员隔离构件,进而降低耦合性
Class类和java.lang.reflect类库一起对反射进行了支持。类库中包含了Field,Method以及Constructor类。这些类型对象是由jvm在运行时创建的。用以表示未知类里的对象。其中用invoke()调用与Method对象关联的方法。