反射(Reflection)與類別加載器

Reflection & ClassLoader

每一個被加載至 JVM 的類別, 都以 java.lang.Class 的實例(Instance)存活於其中!

(下列內容大多參考由 WisdomFish, Kuo 所反製的 Java SE 6 正體中文文檔.)



JVM 動態加載機制


java.lang.Class 的實例由 JVM 自動產生.


java.lang
類別 Class<T>

java.lang.Object
繼承者 java.lang.Class<T>

型別參數:
T - 由此 Class 物件建模的類別的型別。例如,String.class 的型別是 Class<String>。 如果將被建模的類別未知,則使用 Class<?>
所有已實作的介面:
Serializable, AnnotatedElement, GenericDeclaration, Type

public final class Class<T>
extends Object
implements Serializable, GenericDeclaration, Type, AnnotatedElement

Class 類別的實例(Instance), 表示正在運行的 Java 應用程序中的類別和介面。其包含列舉(Enum)是一種類別,註釋(Annotation)是一種介面。每個陣列[array]屬於被映射為 Class 物件的一個類別,所有具有相同元素型別和維數的陣列都共享該 Class 物件。基本的 Java 型別(booleanbytecharshortintlongfloatdouble)和關鍵字 void 也表示為 Class 物件。

Class 沒有公共建構子。Class 物件是在載入類別時由 Java 虛擬機器以及通過調用類別載入器中的 defineClass 方法自動建構的。

以下範例使用 Class 物件來顯示物件的類別名:

     void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}

還可以使用一個類別文字值(JLS Section 15.8.2) 來獲取指定型別(或 void)的 Class 物件。例如:

     System.out.println("The name of class Foo is: "+Foo.class.getName());

從以下版本開始:
JDK1.0
另請參見:
ClassLoader.defineClass(byte[], int, int), 序 列化表格


常用的配套方法





Comments