Java Reflection(二):Classes
使用Java反射機製可以在運行時期檢查Java類的信息,檢查Java類的信息往往是你在使用Java反射機製的時候所做的第一件事情,通過獲取類的信息你可以獲取以下相關的內容:
Class對象
類名
修飾符
包信息
父類
實現的接口
構造器
方法
變量
注解
除了上述這些內容,還有很多的信息你可以通過反射機製獲得,如果你想要知道全部的信息你可以查看相應的文檔JavaDoc for java.lang.Class裏麵有詳盡的描述。
在本節中我們會簡短的涉及上述所提及的信息,上述的一些主題我們會使用單獨的章節進行更詳細的描述,比如這段內容會描述如何獲取一個類的所有方法或者指定方法,但是在單獨的章節中則會向你展示如何調用反射獲得的方法(Method Object),如何在多個同名方法中通過給定的參數集合匹配到指定的方法,在一個方法通過反射機製調用的時候會拋出那些異常?如何準確的獲取getter/setter方法等等。本節的內容主要是介紹Class類以及你能從Class類中獲取哪些信息。
Class對象
在你想檢查一個類的信息之前,你首先需要獲取類的Class對象。Java中的所有類型包括基本類型(int, long, float等等),即使是數組都有與之關聯的Class類的對象。如果你在編譯期知道一個類的名字的話,那麼你可以使用如下的方式獲取一個類的Class對象。
Class myObjectClass = MyObject.class;
如果你在編譯期不知道類的名字,但是你可以在運行期獲得到類名的字符串,那麼你則可以這麼做來獲取Class對象:
String className = ... ;//在運行期獲取的類名字符串 Class class = Class.forName(className);
在使用Class.forName()方法時,你必須提供一個類的全名,這個全名包括類所在的包的名字。例如MyObject類位於com.jenkov.myapp包,那麼他的全名就是com.jenkov.myapp.MyObject。
如果在調用Class.forName()方法時,沒有在編譯路徑下(classpath)找到對應的類,那麼將會拋出ClassNotFoundException。
類名
你可以從Class對象中獲取兩個版本的類名。
通過getName() 方法返回類的全限定類名(包含包名):
Class aClass = ... //獲取Class對象,具體方式可見Class對象小節 String className = aClass.getName();
如果你僅僅隻是想獲取類的名字(不包含包名),那麼你可以使用getSimpleName()方法:
Class aClass = ... //獲取Class對象,具體方式可見Class對象小節 String simpleClassName = aClass.getSimpleName();
修飾符
可以通過Class對象來訪問一個類的修飾符,即public,private,static等等的關鍵字,你可以使用如下方法來獲取類的修飾符:
Class aClass = ... //獲取Class對象,具體方式可見Class對象小節 int modifiers = aClass.getModifiers();
修飾符都被包裝成一個int類型的數字,這樣每個修飾符都是一個位標識(flag bit),這個位標識可以設置和清除修飾符的類型。
可以使用java.lang.reflect.Modifier類中的方法來檢查修飾符的類型:
Modifier.isAbstract(int modifiers); Modifier.isFinal(int modifiers); Modifier.isInterface(int modifiers); Modifier.isNative(int modifiers); Modifier.isPrivate(int modifiers); Modifier.isProtected(int modifiers); Modifier.isPublic(int modifiers); Modifier.isStatic(int modifiers); Modifier.isStrict(int modifiers); Modifier.isSynchronized(int modifiers); Modifier.isTransient(int modifiers); Modifier.isVolatile(int modifiers);
包信息
可以使用Class對象通過如下的方式獲取包信息:
Class aClass = ... //獲取Class對象,具體方式可見Class對象小節 Package package = aClass.getPackage();
通過Package對象你可以獲取包的相關信息,比如包名,你也可以通過Manifest文件訪問位於編譯路徑下jar包的指定信息,比如你可以在Manifest文件中指定包的版本編號。更多的Package類信息可以閱讀java.lang.Package。
父類
通過Class對象你可以訪問類的父類,如下例:
Class superclass = aClass.getSuperclass();
可以看到superclass對象其實就是一個Class類的實例,所以你可以繼續在這個對象上進行反射操作。
實現的接口
可以通過如下方式獲取指定類所實現的接口集合:
Class aClass = ... //獲取Class對象,具體方式可見Class對象小節 Class[] interfaces = aClass.getInterfaces();
由於一個類可以實現多個接口,因此getInterfaces();方法返回一個Class數組,在Java中接口同樣有對應的Class對象。
注意:getInterfaces()方法僅僅隻返回當前類所實現的接口。當前類的父類如果實現了接口,這些接口是不會在返回的Class集合中的,盡管實際上當前類其實已經實現了父類接口。
構造器
你可以通過如下方式訪問一個類的構造方法:
Constructor[] constructors = aClass.getConstructors();
更多有關Constructor的信息可以訪問Constructors。
方法
你可以通過如下方式訪問一個類的所有方法:
Method[] method = aClass.getMethods();
更多有關Method的信息可以訪問Methods。
變量
你可以通過如下方式訪問一個類的成員變量:
Field[] method = aClass.getFields();
更多有關Field的信息可以訪問Fields。
注解
你可以通過如下方式訪問一個類的注解:
Annotation[] annotations = aClass.getAnnotations();
更多有關Annotation的信息可以訪問Annotations。
最後更新:2017-05-23 14:01:48