版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011067966/article/details/80375442
类型信息
运行时类型信息使得你可以在程序运行时发现和使用类型信息。
14.1 为什么需要RTTI
RTTI:在运行时,识别一个对象的类型。
使用RTTI可以确定引用的确切类型。
14.2 Class对象##
Class对象记录着运行时的类型信息。
Class c = Class.forName(“Gum”);可以获得Class引用。
c.getInterfaces()获取接口
c.getSuperclass()获取父类
c.newInstance()获取实例
- 类字面量
类名.class也可以获得Class对象的引用。
当使用".class"来创建Class对象引用时,不会自动初始化改Class对象。
初始化被延迟到了对静态方法或非常数静态域首次引用时执行。 - 泛型的Class引用
当将泛型语法作用于Class对象时,newInstance()将返回改对象的确切
类型。 - 新的转型语法
cast()语法接受参数对象,并将其转型为Class引用的类型。
14.3类型转换前先做检查##
RTTI的形式包括:
1)传统的类型转换,如"(Shape)".
2)代表对象类型的Class对象。
3)instanceof告诉是不是某个特定类型的实例。
14.4 注册工厂##
工厂方法设计模式:将对象的创建工作交给类自己去完成。
14.5 instanceof与Class的等价性##
instanceof保持了类型的概念,它指的是“是这个类或这个类的派生了吗”
Class 没有考虑继承,指的是确实类型,是或者不是。
14.6 反射:运行时的类信息##
如果不知道某个类的确切信息RTTI可以告诉你,但是有个限制:这个类型在编译时期必须已知。
RTTI与反射之间的区别在于:对于RTTI来说,编辑器在编译时打开和检查.class文件;反射机制来说,.class文件在编译时期是不可获取的,所以是咋运行时打开和检查.class文件。
- 类方法提取器
Class的getMethods()方法和getConstructors()分别可以返回类的方法,参数,返回值等信息。
14.7 动态代理##
代理是基本设计模式之一。
Proxy.newProxyInstance(classLoader,interface.class,invocationHandler)可以创建动态代理.
14.8空对象##
14.9 接口与类型信息##
interface关键字的一种重要目标就是允许程序员隔离构件,降低耦合性。通过接口可以实现这一目标,但是通过类型信息,这种耦合性还是可以传播出去。
通过反射可以调用所有方法。