【发布时间】:2013-05-09 08:42:51
【问题描述】:
我的问题是如何在运行时加载类信息?
当有人打电话给instanceof 时,这算是 RTTI 还是反射?还是视实际情况而定?
【问题讨论】:
标签: java reflection terminology rtti instanceof
我的问题是如何在运行时加载类信息?
当有人打电话给instanceof 时,这算是 RTTI 还是反射?还是视实际情况而定?
【问题讨论】:
标签: java reflection terminology rtti instanceof
简而言之,RTTI 和反射之间的真正区别在于,使用 RTTI,编译器会在编译时打开并检查 .class 文件。通过反射,.class 文件在编译时不可用;它由运行时环境打开并检查。
【讨论】:
术语“RTTI”是一个特定于 C++ 的术语,指的是允许程序在运行时确定各种对象的动态类型的核心语言的功能。它通常指的是dynamic_cast 或typeid 运算符,以及由typeid 生成的相关std::type_info 对象。
另一方面,术语反射是跨编程语言使用的通用术语,指程序在运行时检查和修改其对象、类型等的能力。
我听说适用于instanceof 的术语是type introspection,而instanceof 有时也称为对象自省,因为程序可以查看正在运行的类型以确定要采取的行动方案。我认为这是一个比反射更弱的术语,因为它不允许对对象的字段或方法进行详尽的内省,但我认为调用 instanceof 运算符反射在技术上是不正确的.
关于您的另一个问题 - 类信息如何在运行时加载? - 这真的取决于 JVM 的实现。 ClassLoader 类型最终负责将类加载到系统中,但 JVM 可以随心所欲地解释它。我曾经用 JavaScript 构建了一个原型 JVM,内部所有的反射调用都只是查询我用来表示类、字段和方法的底层 JS 数据结构。我可以想象 HotSpot JVM 做了一些完全不同的事情,但它几乎是由实现定义的。
希望这会有所帮助!
【讨论】: