Java反射學習<BR>所謂反射,可以理解為在運行時期獲取物件類型資訊的操作。傳統的程式設計方法要求程式設計師在編譯階段決定使用的類型,但是在反射的幫助下,程式設計人員可以動態獲取這些信息,從而編寫更具有可移植性的程式碼。嚴格來說,反射並非程式語言的特性,因為在任何一種語言都可以實現反射機制,但是如果程式語言本身支援反射,那麼反射的實作就會方便很多。
1,取得型別類別<BR>我們知道在Java中一切都是對象,我們一般所使用的物件都直接或間接繼承自Object類別。 Object類別中包含一個方法叫做getClass,利用這個方法就可以取得一個實例的型別類別。類型類別指的是代表一個類型的類,因為一切都是對象,類型也不例外,在Java中使用類型類別來表示一個類型。所有的型別類別都是Class類別的實例。例如,有以下一段程式碼:
A a = new A();
if(a.getClass()==A.class)
System.out.println("equal");
else System.out.println("unequal");
結果就是印出“equal”。
可以看到,物件a是A的實例,A某一個類,在if語句中使用a.getClass()返回的結果正是A的類型類,在Java中表示一個特定類型的類型類別可以用“類型.class」的方式獲得,因為a.getClass()獲得是A的類型類,也就是A.class,因此上面的程式碼執行的結果就是印出「equal」。特別注意的是,類型類別是一一對應的,父類的類型類別和子類別的類型類別是不同的,因此,假設A是B的子類,那麼如下的程式碼將得到「unequal」的輸出:
A a = new A();
if(a.getClass()==B.class)
System.out.println("equal");
else System.out.println("unequal");
因此,如果你知道一個實例,那麼你可以透過實例的「getClass()」方法來獲得該物件的類型類,如果你知道一個類型,那麼你可以使用「.class」的方法來獲得該類型的類型類別。
2,獲得類型的信息<BR>在獲得類型類別之後,你就可以呼叫其中的一些方法獲得類型的信息了,主要的方法有:
getName():String:取得該類型的全名名稱。
getSuperClass():Class:取得該類型的直接父類,如果該類型沒有直接父類,那麼傳回null。
getInterfaces():Class[]:取得該類型實作的所有介面。
isArray():boolean:判斷該型別是否為陣列。
isEnum():boolean:判斷該型別是否為枚舉型別。
isInterface():boolean:判斷該類型是否為介面。
isPrimitive():boolean:判斷該類型是否為基本型,即是否為int,boolean,double等等。
isAssignableFrom(Class cls):boolean:判斷這個類型是否是類型cls的父(祖先)類別或父(祖先)介面。
getComponentType():Class:如果該類型是數組,那麼則傳回該數組的元件類型。
另外還可以進行型別轉換這類的操作,主要方法有:
asSubclass(Class clazz):Class:將這個類型