【譯】2. Java反射——Class對象


原文地址:http://tutorials.jenkov.com/java-reflection/classes.html

===========================================================================================

在運行時,你可以用Java反射檢查Java類。當你使用反射時,你經常做的第一件事是檢查類。從類中你可以獲取下列相關信息:

  • Class Name
  • Class Modifies (public, private, synchronized etc.)
  • Package Info
  • Superclass
  • Implemented Interfaces
  • Constructors
  • Methods
  • Fields
  • Annotations

  再加上很多和Java類相關的信息。如果想要完整的列表,你應該去查閱java.lang.Class的JavaDoc。本篇文章將會簡要地涉及上述提到的信息。一些主題也會在單獨的文章中做更詳細地研究。例如,本文將會告訴你怎么獲取所有的方法或者一個特定的方法,而在其他單獨的文章中將會告訴你如何調用該方法,在多個方法擁有相同方法名的情況下如何找到和給定參數匹配的方法,通過反射調用一個方法時會拋出什么異常,如何識別出getter/setter方法等。這篇文章的目的主要是為了介紹Class對象以及你可以從中獲取哪些信息。

===========================================================================================

  • The Class Object

  在你能對一個類做任何檢查之前,你需要獲取該類的java.lang.Class對象。Java中包括原始類型(int, long, float, etc.)和數組在內的所有類型都有一個相關聯的Class對象。如果你在編譯的時候知道一個類的類名,你可以像下面這樣獲取一個Class對象:

Class myObjectClass = MyObject.class

  如果在編譯的時候你不知道類名,但是在運行時有一個字符串形式的類名,你可以這樣做:

String className = ... //obtain class name as string at runtime Class class = Class.forName(className);

  當使用Class.forName()方法時,你必須提供完整有效的類名。這個類名包括完整的包名。例如,如果MyObject位於包com.jenkov.myapp中,那么完整有效的類名為com.jenkov.myapp.MyObject。

  在運行時,如果該類在classpath中找不到,則Class.forName()方法會拋ClassNotFoundException。

===========================================================================================

  • Class Name

  從一個Class對象中,你可以得到兩種類名。像下面這樣通過getName()方法可以得到完成有效的類名(包括包名):

Class aClass = ... //obtain Class object. See prev. section
String className = aClass.getName();

     如果你想要獲取不包含包名的類名,你可以像下面這樣使用getSimpleName()方法獲取:

Class  aClass = ... //obtain Class object. See prev. section
String simpleClassName = aClass.getSimpleName();

===========================================================================================

  • Modifiers

  你可以通過Class對象訪問類的修飾符。類的修飾符即“public”、“private”、“static”等關鍵字。你可以像這樣獲取類的修飾符:

Class  aClass = ... //obtain Class object. See prev. section
int modifiers = aClass.getModifiers();

     修飾符被打包成一個int,每個修飾符是一個標志位,可以被置位或清零。你可以用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)

===========================================================================================

  • Package Info

  你可以像這樣從Class對象中獲取包的相關信息:

Class  aClass = ... //obtain Class object. See prev. section
Package package = aClass.getPackage();

     從Package對象中,你可以訪問像包名這樣的信息。你也可以訪問在classpath中的JAR包中Manifest文件所指定的該包的信息。例如,你可以在Manifest文件中指定包的版本號。你可以從java.lang.Package中閱讀更多和Package類相關的信息。

===========================================================================================

  • Superclass

  你可以用Class對象訪問超類。如下:

Class superclass = aClass.getSuperclass();

     超類的Class對象和其他類的Class對象一樣,所以你也可以繼續在超類上用類的反射。

===========================================================================================

  • Implemented Interfaces

     可以得到一個給定類實現的接口的列表。如下:

Class  aClass = ... //obtain Class object. See prev. section
Class[] interfaces = aClass.getInterfaces();

     一個類可以實現多個接口。因此會返回一個Class類型的數組。在Java反射機制中,接口也是由Class對象來表示的。

     注:只有被給定類特別聲明實現過的接口才會被返回。如果一個超類實現了一個接口,但是該類沒有特別聲明它已經實現了這個接口,那么這個接口不會出現在返回的數組中。即使該類實際上在它的超類中實現過該接口。
     要獲取一個給定類的完整的所實現接口的列表,你將不得不遞歸的去查詢該類以及它的超類。

===========================================================================================

  • Constructors

     你可以像這樣訪問一個類的構造函數:

Constructor[] constructors = aClass.getConstructors();

     構造函數在 Java反射——構造函數 中會有詳細介紹。

===========================================================================================

  • Methods

     你可以像這樣訪問一個類的方法:

Method[] method = aClass.getMethods();

  方法在 Java反射——方法 中會有詳細介紹。

===========================================================================================

  • Fields

     你可以像這樣訪問類的字段(成員變量):

Field[] method = aClass.getFields();

     字段在 Java反射——字段 中會有詳細介紹。

===========================================================================================

  • Annotations

  你可以像這樣訪問類的注解:

Annotation[] annotations = aClass.getAnnotations();

     注解在 Java反射——注解 中會有詳細介紹。

 

 ========================================================================================

  • 目錄

  這是一個本教程到目前為止涵蓋的主題列表:     

  1. Java反射——引言
  2. Java反射——Class對象
  3. Java反射——構造函數
  4. Java反射——字段
  5. Java反射——方法
  6. Java反射——Getter和Setter
  7. Java反射——私有字段和私有方法
  8. Java反射——注解
  9. Java反射——泛型
  10. Java反射——數組
  11. Java反射——動態代理
  12. Java反射——類的動態加載和重新加載

(敬請期待下一篇翻譯)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM