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支持了哪些机制和框架功能
.......
相关推荐
MFC框架仿真,实现RTTI和动态创建
MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 ...
Delphi的RTTI机制文档
在C++中如果使用多态继承类,对于多态性的对象,在程序编译时可能会出现无法确定对象的类型的情况,这事就需要通过RTTI动态识别对象的类型。因此,本文探讨了RTTI的使用细节。同时,由于有些平台C++编译器(如...
delphi RTTI功能示例 演示如何在delphi 中使用rtti
个人收集的RTTI机制....好的话就顶
c++ RTTI深度解析, 运行时类型识别技术
blog文章:一种线程消息驱动及RTTI分发操作的示例
候老师讲的RTTI 资源难得 希望大家喜欢
例如: ...就可以随时随地获取和编辑当前dataset-Fields的数据 edtEmployee.Text := Employee.emp_name.Value; Employee.BeginEdit; Employee.emp_name.Value := edtEmployee.Text; Employee.Update;
博客中使用的完整源码【MFC(2)】,仿真了 MFC 的 RTTI。博客地址: http://blog.csdn.net/raito__/article/details/51684826
Delphi RTTI usage example
MFC中的RTTI,动态创建,消息映射,消息传递。
RTTI(Run-Time Type Information),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
C运行时类型信息RTTI及类型转换的简单介绍
运行时类型识别演示
了解魔术般的技巧:RTTI初学者指南.flv
实现c++根据类名创建c++ 对象,一个文件简单明了,,,,,
RTTI内存模型布局研究