我的问题是在运行时如何加载类信息?
当有人打电话时instanceof
,这被认为是 RTTI 还是反射?还是视实际情况而定?
我的问题是在运行时如何加载类信息?
当有人打电话时instanceof
,这被认为是 RTTI 还是反射?还是视实际情况而定?
术语“ RTTI ”是一个特定于 C++ 的术语,指的是允许程序在运行时确定各种对象的动态类型的核心语言的功能。它通常指的是dynamic_cast
ortypeid
运算符,以及由 产生的关联std::type_info
对象typeid
。
另一方面,术语反射是跨编程语言使用的通用术语,指程序在运行时检查和修改其对象、类型等的能力。
我听说过的术语instanceof
是类型自省,instanceof
有时也称为对象自省,因为允许程序查看正在运行的类型以确定要采取的行动方案。我认为这是一个比反射更弱的术语,因为它不允许对对象的字段或方法进行详细的内省,但我认为调用instanceof
运算符反射的使用在技术上并不是不正确的。
至于您的另一个问题 - 类信息如何在运行时加载?- 这真的取决于 JVM 的实现。该ClassLoader
类型最终负责将类加载到系统中,但 JVM 可以随心所欲地解释它。我曾经用 JavaScript 构建了一个原型 JVM,内部所有的反射调用都只是查询我用来表示类、字段和方法的底层 JS 数据结构。我会想象 HotSpot JVM 做了一些完全不同的事情,但它几乎是由实现定义的。
希望这可以帮助!
In short, the true difference between RTTI and reflection is that with RTTI, the compiler opens and examines the .class file at compile time. With reflection, the .class file is unavailable at compile time; it is opened and examined by the runtime environment.