类型信息
运行时类型信息使得你可以在程序运行时发现和使用类型信息。
Java在运行时识别对象和类的信息主要有两种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型;另一种是反射机制,它允许我们在运行时发现和使用类的信息。
一、为什么需要RTTI
在Java中所有的类型转换都是在运行时进行正确性检查的,这是RTTI最基本的使用形式,RTTI名字的含义:在运行时,识别一个对象的类型。
多态机制下,代码会更容易些,更容易读,且更便于维护,设计也更容易实现,理解和改变。多态是面向对象编程的基本目标。
二、Class对象
Class对象就是用来创建类的所有的常规对象的。类是程序的一部分,每个类都有一个Class对象,换言之,每当编写并且编译了一个新类,就会产生一个Class对象。
类加载器子系统实际上可以包含一条类加载器链,但是只有一个原生类加载器,它是JVM实现的一部分。构造器也是类的静态方法,使用new操作符创建类的新对象也会被当做对类的静态成员的引用。
Class.forName()获取对恰当的Class的对象的引用。Class的newInstance()方法是实现虚拟构造器的一种突途径,虚拟构造器允许你声明,我不知道你的确切类型,但是要正确地创建你自己。
类字面常量:如 Student.class;这样更简单,更安全,在编译时会受到检查,也更高效。使用.class来创建对Class对象的引用时,不会自动初始化该Class对象,包含三个步骤:1,加载,2,连接,3,初始化
泛化Class引用:Class引用总是指向某个Class对象,它可以制造类的实例,并包含可作用于这些实例的所有方法代码。
三、类型转换前先做检查
迄今为止,已知的RTTI形式包括:1,传统的类型转换,2,代表对象类型的Class对象。
instanceof有比较严格的限制:只可将其与命名类型进行比较,而不能与Class对象作比较。
四、注册工厂
使用工厂方法设计模式,将对象的创建工作交给类自己去完成。工厂方法可以被多态地调用,从而创建恰当类型的对象。
五、instanceof与Class的等价性
instanceof保持类型的概念:指的是你是这个类吗,或者你是这个类的派生类吗。Class对象没有考虑继承:它或者是这个确切的类型,或者不是。
六、反射:运行时的类信息
在编译时,编译器必须知道所有要通过RTTI来处理的类。快速应用开发(RAD),集成开发环境(IDE)。
反射在创建更加动态的代码时很有用的。反射机制体统了一种方法,使我们能够编写可以自动展示完整接口的简单工具。
七、动态代理
代理是基本的设计模式之一,它提供额外的或不同的操作,而插入的用来代替实际对象的对象。代理通常充当着中间人的角色。
Java的动态代理比代理的思想更前进迈进了一步,因为它可以动态地创建代理并动态地处理对所代理方法的调用。
八、空对象
空对象最有用之处在于它更靠近数据,因为对象表示的问题空间内的实体。
空对象的逻辑变体是模拟对象和桩。与空对象一样,他们都表示在最终的程序中所使用的实际对象。模拟对象往往是轻量级和自测试的,通常很多模拟对象被创建出来是为了处理各种不同的测试情况。
桩只是返回桩数据,它通常是重量级的,并且经常在测试之间被复用。
九、接口与类型信息
interface关键字的一种重要目标就是允许程序员隔离构件,进而降低耦合性。
十、总结
面向对象编程语言的目的是让我们在凡是可以使用的地方都使用欧冠多态机制,只在必须的时候使用RTTI。然而使用多态机制的方法调用,要求我们拥有基类定义的控制权,因为在扩展程序的时候,可能发现基类并未包含想要的方法。
RTTI的效率问题,反射与动态代码是java的重要特征。