鍍金池/ 教程/ Java/ java 類
Java 數(shù)組
Java 訪問器
Java 泛型
Java 方法
指南
Java 動態(tài)代理
Java 變量
Java 注解
Java 私有變量和私有方法
Java 動態(tài)類加載與重載
java 類
Java 構(gòu)造器

java 類

原文地址

作者: Jakob Jenkov 譯者:葉文海(yewenhai@gamil.com)

使用 Java 反射機制可以在運行時期檢查 Java 類的信息,檢查 Java 類的信息往往是你在使用 Java 反射機制的時候所做的第一件事情,通過獲取類的信息你可以獲取以下相關(guān)的內(nèi)容:

  1. Class 對象
  2. 類名
  3. 修飾符
  4. 包信息
  5. 父類
  6. 實現(xiàn)的接口
  7. 構(gòu)造器
  8. 方法
  9. 變量
  10. 注解

除了上述這些內(nèi)容,還有很多的信息你可以通過反射機制獲得,如果你想要知道全部的信息你可以查看相應(yīng)的文檔 JavaDoc for java.lang.Class 里面有詳盡的描述。

在本節(jié)中我們會簡短的涉及上述所提及的信息,上述的一些主題我們會使用單獨的章節(jié)進行更詳細的描述,比如這段內(nèi)容會描述如何獲取一個類的所有方法或者指定方法,但是在單獨的章節(jié)中則會向你展示如何調(diào)用反射獲得的方法(Method Object),如何在多個同名方法中通過給定的參數(shù)集合匹配到指定的方法,在一個方法通過反射機制調(diào)用的時候會拋出那些異常?如何準確的獲取 getter/setter 方法等等。本節(jié)的內(nèi)容主要是介紹 Class 類以及你能從Class類中獲取哪些信息。

Class 對象

在你想檢查一個類的信息之前,你首先需要獲取類的 Class 對象。Java 中的所有類型包括基本類型(int, long, float等等),即使是數(shù)組都有與之關(guān)聯(lián)的 Class 類的對象。如果你在編譯期知道一個類的名字的話,那么你可以使用如下的方式獲取一個類的 Class 對象。

Class myObjectClass = MyObject.class;

如果你在編譯期不知道類的名字,但是你可以在運行期獲得到類名的字符串,那么你則可以這么做來獲取 Class 對象:

String className = ... ;//在運行期獲取的類名字符串
Class class = Class.forName(className);

在使用 Class.forName() 方法時,你必須提供一個類的全名,這個全名包括類所在的包的名字。例如 MyObject 類位于 com.jenkov.myapp 包,那么他的全名就是 com.jenkov.myapp.MyObject。 如果在調(diào)用Class.forName()方法時,沒有在編譯路徑下(classpath)找到對應(yīng)的類,那么將會拋出ClassNotFoundException。

類名

你可以從 Class 對象中獲取兩個版本的類名。

通過 getName() 方法返回類的全限定類名(包含包名):

Class aClass = ... //獲取Class對象,具體方式可見Class對象小節(jié)
String className = aClass.getName();

如果你僅僅只是想獲取類的名字(不包含包名),那么你可以使用 getSimpleName()方法:

Class aClass = ... //獲取Class對象,具體方式可見Class對象小節(jié)
String simpleClassName = aClass.getSimpleName();

修飾符

可以通過 Class 對象來訪問一個類的修飾符, 即public,private,static 等等的關(guān)鍵字,你可以使用如下方法來獲取類的修飾符:

Class  aClass = ... //獲取Class對象,具體方式可見Class對象小節(jié)
int modifiers = aClass.getModifiers();

修飾符都被包裝成一個int類型的數(shù)字,這樣每個修飾符都是一個位標識(flag bit),這個位標識可以設(shè)置和清除修飾符的類型。 可以使用 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對象小節(jié)
Package package = aClass.getPackage();

通過 Package 對象你可以獲取包的相關(guān)信息,比如包名,你也可以通過 Manifest 文件訪問位于編譯路徑下 jar 包的指定信息,比如你可以在 Manifest 文件中指定包的版本編號。更多的 Package 類信息可以閱讀 java.lang.Package。

父類

通過 Class 對象你可以訪問類的父類,如下例:

Class superclass = aClass.getSuperclass();

可以看到 superclass 對象其實就是一個 Class 類的實例,所以你可以繼續(xù)在這個對象上進行反射操作。

實現(xiàn)的接口

可以通過如下方式獲取指定類所實現(xiàn)的接口集合:

Class  aClass = ... //獲取Class對象,具體方式可見Class對象小節(jié)
Class[] interfaces = aClass.getInterfaces();

由于一個類可以實現(xiàn)多個接口,因此 getInterfaces(); 方法返回一個 Class 數(shù)組,在 Java 中接口同樣有對應(yīng)的 Class 對象。 注意:getInterfaces() 方法僅僅只返回當前類所實現(xiàn)的接口。當前類的父類如果實現(xiàn)了接口,這些接口是不會在返回的 Class 集合中的,盡管實際上當前類其實已經(jīng)實現(xiàn)了父類接口。

構(gòu)造器

你可以通過如下方式訪問一個類的構(gòu)造方法:

Constructor[] constructors = aClass.getConstructors();

更多有關(guān) Constructor 的信息可以訪問 Constructors。

方法

你可以通過如下方式訪問一個類的所有方法:

Method[] method = aClass.getMethods();

變量

你可以通過如下方式訪問一個類的成員變量:

Field[] method = aClass.getFields();

更多有關(guān) Field 的信息可以訪問 Fields。

注解

你可以通過如下方式訪問一個類的注解:

Annotation[] annotations = aClass.getAnnotations();
上一篇:Java 動態(tài)代理下一篇:Java 方法