反射:运行时的类信息

来源:互联网 发布:2017人工智能最新进展 编辑:程序博客网 时间:2024/06/07 06:19

RTTI如果想要知道某个对象的类型信息,这个类型在编译时必须已知,这样才能使用RTTI识别它。

假设你获取了一个指向某个并不在你的编程空间中的对象的引用,在编译时你的程序根本没法获知这个对象所属的类(假设从磁盘文件或者网络连接中获取了一串字节代表一个类)。

反射提供了一种机制:用来检查可用的方法,并返回方法名。

人们想要在运行时获取类的信息的另一个动机,是希望提供在跨网络的远程平台上创建和运行对象的能力,这被称为RMI(远程方法调用),它允许一个java程序将对象分布到多台机器上。

Class类和java.lang.reflect类库一起对反射的概念进行了支持。

反射机制没有什么神奇之处:当通过反射与一个未知类型的对象打交道时,JVM只是简单的检查这个对象,看它属于哪个特定的类(就像RTTI那样)。在用它做别的事情之前必须先将那个类的Class对象加载进来。因此,那个类的.class文件对于JVM来说必须是可获得的,要么在本机上,要么可以通过网络取得。

所以RTTI和反射之间真正的区别在于:对于RTTI,编译器在编译时打开和检查.class文件;对于反射,.class文件在编译时是不可获取的,所以在运行时打开和检查.class文件。

0 0