Java反射學習
所謂反射,可以理解為在執行時期獲取物件型別資訊的操作。傳統的程式設計方法要求程式設計師在編譯階段決定使用的型別,但是在反射的幫助下,程式設計人員可以動態獲取這些資訊,從而編寫更加具有可移植性的程式碼。嚴格地說,反射並非程式語言的特性,因為在任何一種語言都可以實現反射機制,但是如果程式語言本身支援反射,那麼反射的實現就會方便很多。
1,獲得型別類
我們知道在Java中一切都是物件,我們一般所使用的物件都直接或間接繼承自Object類。Object類中包含一個方法名叫getClass,利用這個方法就可以獲得一個例項的型別類。型別類指的是代表一個型別的類,因為一切皆是物件,型別也不例外,在Java使用型別類來表示一個型別。所有的型別類都是Class類的例項。例如,有如下一段程式碼:
A a = new A();
if(lass()==s)
tln("equal");
else tln("unequal");
結果就是列印出 “equal”。
可以看到,物件a是A的一個例項,A某一個類,在if語句中使用lass()返回的結果正是A的型別類,在Java中表示一個特定型別的型別類可以用“型別s”的方式獲得,因為lass()獲得是A的型別類,也就是s,因此上面的程式碼執行的.結果就是打印出 “equal”。特別注意的是,型別類是一一對應的,父類的型別類和子類的型別類是不同的,因此,假設A是B的子類,那麼如下的程式碼將得到 “unequal”的輸出:
A a = new A();
if(lass()==s)
tln("equal");
else tln("unequal");
因此,如果你知道一個例項,那麼你可以通過例項的“getClass()”方法獲得該物件的型別類,如果你知道一個型別,那麼你可以使用“s”的方法獲得該型別的型別類。
2,獲得型別的資訊
在獲得型別類之後,你就可以呼叫其中的一些方法獲得型別的資訊了,主要的方法有:
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:如果該型別是一個數組,那麼返回該陣列的元件型別。