以JDK6为例
介绍
RTTI运行时类型信息使得可以在程序运行时发现和使用类型信息。
Run-Time Type Information
使用方式
Java是如何在运行时识别对象和类的信息的,主要有两种方式(还有辅助的第三种方式,见下描述)
- “传统的”RTTI,它假定在编译时已经知道所有的类型,比如
Shape s = (Shape)s1
; - “反射”机制,它运行在运行时发现和使用类的信息,即使用
Class.forName()
。 - 关键字
instanceof
,它返回一个bool值,它保持类型的概念,它指的是”你是这个类吗?或者你是这个类的派生类吗?”。而如果用==
或equals
比较实际的Class对象,就没有考虑继承它或者是这个确切的类型,或者不是。工作原理
RTTI主要用来运行时获取对象到底是什么具体的类型。
RTTI运行的时候,识别一个对象的类型。(运行的时候获取对象确切的类型)
要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工作是由称为Class对象的特殊对象完成的,它包含与类有关的信息。Java Class对象来执行其RTTI,使用类加载器的子系统实现。
类是程序的重要组成部分,每个类都有一个Class对象,每当编写并编译一个新类就会产生一个Class对象,它被保存在一个同名的.class
文件中。在运行时,生成这个类的对象时,运行这个程序的Java虚拟机(JVM)会确认这个类的Class对象是否已经加载,如果尚未加载,JVM就会根据类名查找.class
文件,并将其载入,一旦这个类的Class对象被载入内存,它就被用来创建这个类的所有对象。
在运行时使用类型信息,就必须首先获得对恰当的Class对象的引用,获取方式有三种。第1种
如果没有持有该类型的对象,则Class.forName()
就是实现此功能的便捷途,因为它不需要对象信息。第2种
如果已经拥有类型的对象,那就可以通过调用getClass()
方法来获取Class引用,它将返回表示该对象的实际类型的Class引用。