java编程思想(第十四章1)

java编程中的运行时类信息(RTTI:Runtime Type Information)可以让我们可以在程序运行时发现和使用类型信息。反射是java获取和使用程序运行时类型的另外一种方法,RTTI与反射的主要表现在于RTTI在编译时打开和检查.class文件而反射在编译时完全无法获取.class文件信息必须在程序运行时才能打开获取.class信息。
Class对象包含了与类有关的信息,Class对象用来创建类的所有常规对象。java使用Class对象来执行其RTTI。类是程序的一部分,每个类都有一个Class对象,我们可以通过Class.forName()方法通过字符串形式的类名获得其class对象引用,进而获得该类的信息,或者可以通过newInstance()方法实现对象的构建;而这里对class对象的获得,使得该类被加载,同时static语句被执行,而单纯对类static final值(编译期常量)的引用不会引起static初始化,也可以说间接的说明了构造器隐式地是静态的。示范程序如下:

package com.isoftstone.fulunyong;
class Candy{
    static{
        System.out.println("Loading Candy");
    }
}

class Gum{
    static{
        System.out.println("Loading Gum");
    }
}
class Cookie{
    static{
        System.out.println("Loading Cookie");
    }
}

public class SweetShop {

    public static void main(String[] args) {
        System.out.println("inside main");
        new Candy();
        System.out.println("After creating Candy");
        try {
            Class.forName("com.isoftstone.fulunyong.Gum");
        } catch (ClassNotFoundException e) {
            // TODO: handle exception
            System.out.println("Couldn't find Gum");
        }
        System.out.println("After Class.forName(\"Gum\")");
        new Cookie();
        System.out.println("After creating Cookie");
    }
}

输出如下:

inside main
Loading Candy
After creating Candy
Loading Gum
After Class.forName("Gum")
Loading Cookie
After creating Cookie

Class引用指向某个Class对象,可制造类的实例,幷包含可作用于这些实例的所有方法代码,还包含该类的静态成员。Java SE5允许对Class引用所指向的Class对象的类型进行限定(通过泛型语法)

Class intClass = int.class;
Class<Integer> genericIntClass = int.class;
Class<?> intClass = int.class;

关键字instanceof,形如 x instanceof Dog 它返回一个布尔值,检测该对象是不是某个特定类型;另一种方式是Class.isInstance()可以动态的检测对象类型。这里需要注意的是使用instanceof 或者 isInstance()方法对对象进行检测时,保持了类型的概念,即检查的是“是这个类或者是这个类的派生类”,而通过使用“==”与获取的class对象引用对比则只是进行确切类型的比较。
如果不知道某个对象的确切类,RTTI可以告诉我们,但是一个前提是这个类型必须在编译时已知。事实上在编译我们的程序时往往我们并不能在编译时获取到类信息,比如我们获取到了一串字节,并且知道这些字节代表了一个类,我们应该怎么获取这个类的具体信息呢。反射就是干这么一件事的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章