读书人

第十四章 门类信息1.0

发布时间: 2012-10-08 19:54:56 作者: rapoo

第十四章 类型信息1.0
运行时类型信息使得你可以在程序运行时发现和使用类型信息。

本章将讨论 Java 是如何允许我们在运行期识别对象和类的信息。主要有两种方式:一种是传统的RTTI,它假定我们在编译期和运行期已经知道了所有的类型;另一种是“反射机制(reflection)”,它允许我们在运行期获得类的信息。我们先讨论“传统”的RTTI,再讨论反射。

使用RTTI,你可以查询某个Shape引用所指向的对象的确切类型,然后选择或者剔除特例。

Class

要理解RTTI在Java中是如何工作的,首先必须要知道类型信息在运行期是如何表示的。这项工作是由被称为“Class对象”的特殊对象完成的,它包含了与类有关的信息。事实上,Class对象正是被用来创建类的“常规”对象的。

作为程序一部分,每个类都有一个Class对象。换言之,每当你编写并且编译了一个新类,就会产生一个Class对象(更恰当地说,是被保存在一个同名的.class文件中)

因此,Java程序在它开始运行之前并非被完全加载,其各个部分是在必须时才加载的。

一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。

Class对象仅在需要的时候才被加载,static初始化是在类加载时进行的。

forName()是取得Class对象的引用的一种方法。它是用一个包含目标类的文本名(注意拼写和大小写)的String作输入参数,返回的是一个Class对象的引用,上面的代码忽略了返回值。对forName()的调用是为了它产生的“副作用”:如果类Gum还没有被加载就加载它。在加载的过程中,Gum的static语句被执行。

如果你已经拥有了一个感兴趣的类型的对象,那就可以通过调用getClass()方法来获取Class引用了,这个方法属于根类Object的一部分,它将返回表示该对象的实际类型的Class引用。Class包含很多有用的方法,下面就是其中的一部分:



在传递给forName的字符串中,你必须使用全限定名。在main中Class.getInterfaces()方法返回的是Class对象,它们表示在感兴趣的Class对象中所包含的接口。getSuperClass也一样。

Class的newInstance()方法是实现“虚拟构造器”的一种途径,虚拟构造器允许你声明:“我不知道你的确切类型,但是无论如何要正确地创建你自己。”在前面的示例中,up仅仅只是一个Class引用,在编译期不具备任何更进一步的类型信息。当你创建新实例时,会得到Object引用,但是这个引用指向的是Toy对象。另外,使用newInstance()来创建的类,必须带有默认的构造器。

读书人网 >编程

热点推荐