Java RTTI运行时类型识别

RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。

RTTI提供了以下两个非常有用的操作符:
(1)typeid操作符,返回指针和引用所指的实际类型。
(2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。

面向对象的编程语言,像C++,Java,delphi都提供了对RTTI的支持。


RTTI(Run-Time Type Identification,通过运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对象,每个java里面的类都对应一个Class对象(在编写并且编译后),这个对象被保存在这个类的同名class文件里。
类加载器在类被第一次静态调用(比如一个静态方法,一个静态代码块或者new关键字调用构造器,注意contructors其实都是静态的)时会把那个对应的Class对象加载到内存中。

在Java运行时,RTTI维护类的相关信息。
多态(polymorphism)是基于RTTI实现的。
RTTI的功能主要是由Class类实现的。

Java中每个对象都有相应的Class类对象,因此,我们随时能通过Class对象知道某个对象“真正”所属的类。无论我们对引用进行怎样的类型转换,对象本身所对应的Class对象都是同一个。当我们通过某个引用调用方法时,Java总能找到正确的Class类中所定义的方法,并执行该Class类中的代码。由于Class对象的存在,Java不会因为类型的向上转换而迷失。这就是多态的原理。


RTTI形式:
(1)Class类的forName静态方法,Class.forName("classname with packagepath")返回一个对类的Class对象的引用;
(2)一种更安全的得到Class类的对象的方式是,使用类字面常量:classname.class;
(3)Java在RTTI中的第三种形式是最常见的,也就是instanceof关键字,该关键字的调用其实就是使用了Class对象,并且返回一个布尔值。如果说instanceof和Class的比较唯一的不同,那就是instanceof如果是其子类的对象也会返回true,而Class对象比较的会是确切的那个类型。

RTTI的限制?
就是它在编译时必须知道一个非常重要的东西:类名(甚至是全类名)

参考:
1. http://baike.baidu.com/link?url=X6OC4jkWMK4BFD6CbcvzEAylridoC_kcPRcymeCYQmL7735Elf13lDrMseWtxvl5q24dwvQZ_V-LyV3PCBF87_
2. http://www.cnblogs.com/vamei/archive/2013/04/14/3013985.html

posted on 2016-07-20 17:14  alvin.zhang  阅读(285)  评论(0编辑  收藏  举报

导航