2016-08-08 15:52:57 +0000   |     java reflection   |   Viewed times   |    

我知道每个认真读过《Think in Java》并且思考过的同学,都会有这个疑惑。

Java RTTI的说法其实有点别扭。Java官方文档 - Java Platform SE 7 从来没有RTTI这个说法。都直接叫“Reflect”或者“Reflection API”。Oracle官方文档对“反射”的描述是这样:

Provides classes and interfaces for obtaining reflective information about classes and objects. Reflection allows programmatic access to information about the fields, methods and constructors of loaded classes, and the use of reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.

所以java的反射机制不但能够在运行时获得对象和类型的信息,而且还能动态加载类,动态访问以及调用目标类型的字段,方法以及构造函数。

Java RTTI这个说法是源自B大的《Thinking in Java》。此前RTTI(Run-time Type Identification)一直是C++的概念。比如type_info类,typeid函数,也能返回类型信息,判断类型是否相等等功能。引某社区里一个叫Chris Smith的老鸟对Java反射和C++ RTTI的对比(也不知道是不是写《Programming F#》的Chris本尊):

Don’t be. They are essentially the same. RTTI is a term from C++ heritage, and Reflection from the “pure” OO heritage. Typically, reflection implies a greater level of control than RTTI. Java’s implementation falls somewhere between the capabilities of RTTI and Reflection, but has been given the name reflection by Sun. —- Chris Smith

所以RTTI和反射是两个不同体系在描述同一件事情。RTTI对应C++体系,反射对应OO面向对象体系。只不过,两者是用的完全不同的两套实现方法。而且相比较而言,Java的反射机制功能比C++的RTTI更完整一些(但按Chris的说法,java的反射也不彻底。)。

一般不要认为Java的反射就是指java.lang.reflect这个包提供的工具类和接口。其实Java的整个对象类型系统,包括所有类的始祖类Object类以及每个对象都附带的Class对象,都是反射机制的一部分。Java最初在设计这个系统的时候就有很深的预谋。

B大明显是先学的C++,所以概念上有RTTI先入为主的影响。理解反射的时候,使劲往原先的概念上靠。其实不用太纠结这两个的区别,知道他们为的都是同一个目的就好了。