`
wusuoya
  • 浏览: 629311 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

RTTI 和 Reflection

    博客分类:
  • Java
阅读更多
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支持了哪些机制和框架功能
.......
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics