`
wusuoya
  • 浏览: 641243 次
  • 性别: 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支持了哪些机制和框架功能
.......
分享到:
评论

相关推荐

    RTTI:Rtti(反思)实践

    在编程领域,RTTI(Run-Time Type Information,运行时类型信息)是一种强大的特性,它允许程序在运行时检查和操作对象的实际类型。RTTI通常在面向对象的语言中使用,如C++或Pascal,用于增强代码的灵活性和动态性。...

    Java进阶教程之运行时类型识别RTTI机制

    `Class`对象不仅可以用来获取类型信息,还可以用于反射(Reflection),动态调用类的方法和访问字段。例如,我们可以通过`getMethod(String name, Class&lt;?&gt;... parameterTypes)`来获取类的方法,然后使用`invoke...

    vtl reflection-开源

    传统的C++内省通常需要借助如RTTI(Run-Time Type Information)或者元对象协议(Meta-Object Protocol)等机制,这些方法往往增加了编译时和运行时的复杂性。而“vtl reflection”则通过标准预处理器指令和强大的...

    第11章 运行期类型鉴定.pdf

    除了上述的“传统”RTTI,还有Java 1.1引入的**反射(Reflection)**机制。反射允许程序在运行时动态地访问和操作类、接口、字段和方法的信息,即使在编译时这些信息未知。反射API包括`Class`类,可以用来获取关于...

    Delphi运行时设计类

    - Delphi中的运行时设计类主要依赖于反射(Reflection)、运行时类型信息(RTTI,Runtime Type Information)以及组件编程技术。 2. **RTTI的作用** - RTTI是Delphi的一个强大特性,它允许在运行时获取类型信息,...

    字符串调用过程或函数

    在Delphi 2010中,`System.Rtti`单元提供了运行时类型信息(RTTI)的支持,使得在运行时访问和操作类型、方法、属性等变得更为方便。通过RTTI,我们可以更容易地实现字符串调用,但这也增加了代码的复杂性。因此,在...

    cpp11-reflection:C ++ 11及更高版本中的反射

    此外,还有一些库,如Boost.TypeIndex和folly/Reflection,它们提供了更高级的反射功能。例如,Boost.TypeIndex提供了类型标识和类型信息的比较,而folly/Reflection则允许在编译时构建类型元数据,并在运行时访问。...

    C++反射&&可用于搭建通用框架

    5. 运行时类型信息(RTTI):`dynamic_cast`、`static_cast`和`typeid`是C++的RTTI(Runtime Type Information)系统的一部分,它们允许在运行时进行类型检查和转换。 6. 设计模式:反射经常与工厂模式、策略模式、...

    反射动态调用DLL方法,含参数

    通过System.Reflection命名空间中的类,如Assembly、Type、MethodInfo、ConstructorInfo等,我们可以动态地创建对象、调用方法、访问属性和字段。 2. 动态调用DLL方法: DLL(Dynamic Link Library)是Windows操作...

    轻松学C之运行时类型标识反射PPT学习教案.pptx

    它位于`System.Reflection`命名空间中,可以用来动态创建对象、调用方法、访问字段和属性等。在使用反射时,通常需要引入`using System.Reflection`。`System.Type`类是反射的核心,它封装了类型信息,并提供了丰富...

    消息反射Demo1

    在.NET框架中,有System.Reflection命名空间提供了一系列的类,如Type、MethodInfo等,用于在运行时获取和操作类型和方法的信息。而在C++中,可能需要利用预处理器宏、RTTI(Run-Time Type Information)或者自定义...

    C++反射机制

    7. **编译时反射(Compile-Time Reflection)**:C++20引入了预览版本的编译时反射提案,虽然目前仅限于基本类型和模板,但未来可能会提供更强大的反射能力。 8. **自定义元数据**:除了标准库提供的类型信息,我们...

    Change C++ code at runtime.zip

    1. **运行时类型信息(RTTI)**:C++标准库提供了RTTI(Run-Time Type Information)功能,如`dynamic_cast`、`typeid`和`std::type_info`,它们可以在运行时检查对象的实际类型,但并不能直接改变代码。 2. **多态...

    轻松学C之运行时类型标识反射学习资料PPT学习教案.pptx

    在C#编程语言中,运行时类型标识(Runtime Type Identification,RTTI)是程序在运行时检查和利用对象实际类型的能力。这一特性对于实现多态性和动态类型操作至关重要。C#提供了三个关键字来支持RTTI:is、as和...

    C++builder基础进阶

    3. **Rtti(Run-Time Type Information)**:C++Builder支持运行时类型信息,允许程序在运行时检查和操作对象的实际类型,增强了代码的灵活性和可扩展性。 4. **FireMonkey(FMX)**:虽然不是C++Builder的基础,但...

    转换器:使用给定的类似于Jinja的模板解析CC ++代码并生成输出的工具

    在C++中,模板引擎可能用于生成序列化和反序列化代码、RTTI(运行时类型信息)相关的代码、以及利用C++20新特性如反射(reflection)的代码。这些功能在处理数据结构的表示、类的元信息以及跨系统通信时非常有用。 ...

    Practical Java(简体中文)

    Java的动态类型系统和RTTI(Run-Time Type Information)、Reflection机制,提供了对运行时类型的深入洞察,增强了程序的灵活性和动态性。此外,Java的**标准程序库**(Java Libraries)是其另一大亮点,涵盖了广泛...

    C#VBDelphi反射工具看源代码了

    通过`System.Rtti`单元,开发者可以使用类型信息上下文(TRttiContext)来获取和操作运行时类型信息。这使得Delphi程序员也能享受到类似C#和VB.NET的反射能力。 MC++,即Microsoft C++/CLI,是微软为.NET框架提供的...

    Practical Java

    此外,包(package)和导入(import)机制提供了清晰的代码组织结构,而动态类型系统(dynamictype system)则增强了语言的灵活性,支持运行时类型识别(RTTI)和反射(Reflection)机制。 #### Java标准库 Java的标准库是其...

Global site tag (gtag.js) - Google Analytics