java的getClass()函式

逸卿發表於2014-04-13

Java反射學習

    所謂反射,可以理解為在執行時期獲取物件型別資訊的操作。傳統的程式設計方法要求程式設計師在編譯階段決定使用的型別,但是在反射的幫助下,程式設計人員可以動態獲取這些資訊,從而編寫更加具有可移植性的程式碼。嚴格地說,反射並非程式語言的特性,因為在任何一種語言都可以實現反射機制,但是如果程式語言本身支援反射,那麼反射的實現就會方便很多。

1,獲得型別類

    我們知道在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,獲得型別的資訊

在獲得型別類之後,你就可以呼叫其中的一些方法獲得型別的資訊了,主要的方法有:

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:將這個型別

相關文章