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可以告訴我們,但是一個前提是這個類型必須在編譯時已知。事實上在編譯我們的程序時往往我們並不能在編譯時獲取到類信息,比如我們獲取到了一串字節,並且知道這些字節代表了一個類,我們應該怎麼獲取這個類的具體信息呢。反射就是幹這麼一件事的。

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