欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RTTI 和 Reflection

程序员文章站 2022-05-13 08:09:07
...
outline
1)  什么是RTTI?
2)RTTI应用场景?(什么情况下要直接使用RTTI,什么机制是基于RTTI实现的即间接使用了RTTI)
3)  直接使用RTTI:Class<?>,如何获得类的Class对象
 
3)Reflection和RTTI的区别 运行时定位class (运行时定位class ;编译时就要定位class)
4)Reflection机制的使用包括Class和Reflection API
5)  Reflection机制支持了哪些场景框架、机制?
 
------------------------------------splitter----------------------------
 
什么是RTTI
在运行时识别一个对象的类型,即RTTI的基本功能
 
提出RTTI功能需求场景
举例:
List<Shape> shapeList = Arrays.asList(new Circle(), new Square(), new Triangle());
容器把其所容纳的元素都当做Object持有,在取出每个元素时,转换成Shape;
这个例子中RTTI类型转换不彻底,Object只被转化成Shape,而不是具体的Circle等。这是因为编译时,通过容器和泛型系统保证集合中元素中时Shape类型,仅此而已;所以在运行时只会完成类型转换到Shape。
如果有进一步需求,明确集合元素Shape类型更加进一步的类型Circle、Square、Triangle.......这个也需要RTTI机制。
 
另外,总结来说:
1)传统类型转换,由RTTI确保类型转换的正确性;如”(Shape)“,如果执行了一个错误的类型转换会抛出”ClassCastException“
2)获取类Class对象,通过这个对象获取运行时需要的类型信息
3)instanceof关键字也需要RTTI支持(Class.isInstance方法)
 
RTTI机制原理
Java中使用每个类的Class对象来保存运行时类型信息的。
每个新类编译后,其对应产生一个Class对象,被一同保存在对应的.class文件中。
类加载器在加载这个类的同时会创建这个类的Class对象。
 
Java是动态加载类的,即只有在需要时才加载;对比C++是静态加载的,即程序运行开始就将所有类加载。
 
Java类动态加载的时机:
1)对该类的第一次静态成员的访问
2)调用该类的构造方法时
 
如何获取一个类的Class对象?
1)Class.forName()
2)某个类对象实例getClass()方法【定义在Object类中】
3)某个类的静态成员Foo.class
 
java.lang.Class<T>
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
1)Class<?> Class<? extends > Class<? super >用法
2)Class.isInstance
3)  instanceof Class对象比较区别 instanceof 可以体现继承层次 Derived instance of Base[TRUE] Derived.class == Base.class[FALSE]
 
-------------------------------------------------------------------splitter----------------------------------------------
Reflection机制的需求
RTTI可以再运行时提供类型信息,但是所涉及的类型信息必须在程序编译时就已知了(即在编译时就可以定位到那个类的class文件了,尽管RTTI并不是在那个时候去定位的)(或者说编译器要提前知道所有可能应用于RTTI的类)
在分布式系统(RMI/RPC等调用)中时无法做到的;那么有没有什么办法解决呢?——Reflection
 
RTTI和Reflection区别
RTTI,在编译时就需要定位和检查.class文件,在运行时动态加载类同时创建各个类的Class对象以支持RTTI;
Reflection,只需要在运行时类的动态加载时可以定位到那个.class文件即可。
 
因为这个原因所以:如果需要根据Reflection获取的类,要创建该类型的对象实例、访问成员等,
需要另外一套机制支持即Java Reflection API;
而无法直接new Foo() 或者Foo.xxx,因为Reflection获取的类型信息在编译时时不可见的,这种代码无法编译通过
 
 
Relfection的核心
1)Class对象
2)Java Reflection API
 
Reflection支持了哪些机制和框架功能
.......
相关标签: rtti reflection