不懂Java高級特性之反射?其實想解決這個問題也不難,下面讓小編帶著大家一起了解怎么去解決,希望大家閱讀完這篇文章后大所收獲。

定義
JAVA反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為java語言的反射機制。
用途
在日常的第三方應用開發過程中,經常會遇到某個類的某個成員變量、方法或是屬性是私有的或是只對系統應用開放,這時候就可以利用Java的反射機制通過反射來獲取所需的私有成員或是方法。當然,也不是所有的都適合反射,之前就遇到一個案例,通過反射得到的結果與預期不符。閱讀源碼發現,經過層層調用后在最終返回結果的地方對應用的權限進行了校驗,對于沒有權限的應用返回值是沒有意義的缺省值,否則返回實際值起到保護用戶的隱私目的。
反射機制的相關類
與Java反射相關的類如下:
| 類名 | 用途 | 
| Class類 | 代表類的實體,在運行的Java應用程序中表示類和接口 | 
| Field類 | 代表類的成員變量(成員變量也稱為類的屬性) | 
| Method類 | 代表類的方法 | 
| Constructor類 | 代表類的構造方法 | 
Class類
Class代表類的實體,在運行的Java應用程序中表示類和接口。在這個類中提供了很多有用的方法,這里對他們簡單的分類介紹。
獲得類相關的方法
| 方法 | 用途 | 
| asSubclass(Class<U> clazz) | 把傳遞的類的對象轉換成代表其子類的對象 | 
| Cast | 把對象轉換成代表類或是接口的對象 | 
| getClassLoader() | 獲得類的加載器 | 
| getClasses() | 返回一個數組,數組中包含該類中所有公共類和接口類的對象 | 
| getDeclaredClasses() | 返回一個數組,數組中包含該類中所有類和接口類的對象 | 
| forName(String className) | 根據類名返回類的對象 | 
| getName() | 獲得類的完整路徑名字 | 
| newInstance() | 創建類的實例 | 
| getPackage() | 獲得類的包 | 
| getSimpleName() | 獲得類的名字 | 
| getSuperclass() | 獲得當前類繼承的父類的名字 | 
| getInterfaces() | 獲得當前類實現的類或是接口 | 
獲得類中屬性相關的方法
| 方法 | 用途 | 
| getAnnotation(Class<A> annotationClass) | 返回該類中與參數類型匹配的公有注解對象 | 
| getAnnotations() | 返回該類所有的公有注解對象 | 
| getDeclaredAnnotation(Class<A> annotationClass) | 返回該類中與參數類型匹配的所有注解對象 | 
| getDeclaredAnnotations() | 返回該類所有的注解對象 | 
獲得類中構造器相關的方法
| 方法 | 用途 | 
| getConstructor(Class...<?> parameterTypes) | 獲得該類中與參數類型匹配的公有構造方法 | 
| getConstructors() | 獲得該類的所有公有構造方法 | 
| getDeclaredConstructor(Class...<?> parameterTypes) | 獲得該類中與參數類型匹配的構造方法 | 
| getDeclaredConstructors() | 獲得該類所有構造方法 | 
獲得類中方法相關的方法
| 方法 | 用途 | 
| getMethod(String name, Class...<?> parameterTypes) | 獲得該類某個公有的方法 | 
| getMethods() | 獲得該類所有公有的方法 | 
| getDeclaredMethod(String name, Class...<?> parameterTypes) | 獲得該類某個方法 | 
| getDeclaredMethods() | 獲得該類所有方法 | 
類中其他重要的方法
| 方法 | 用途 | 
| isAnnotation() | 如果是注解類型則返回true | 
| isAnnotationPresent(Class<? extends Annotation> annotationClass) | 如果是指定類型注解類型則返回true | 
| isAnonymousClass() | 如果是匿名類則返回true | 
| isArray() | 如果是一個數組類則返回true | 
| isEnum() | 如果是枚舉類則返回true | 
| isInstance(Object obj) | 如果obj是該類的實例則返回true | 
| isInterface() | 如果是接口類則返回true | 
| isLocalClass() | 如果是局部類則返回true | 
| isMemberClass() | 如果是內部類則返回true | 
Field類
Field代表類的成員變量(成員變量也稱為類的屬性)。
| 方法 | 用途 | 
| equals(Object obj) | 屬性與obj相等則返回true | 
| get(Object obj) | 獲得obj中對應的屬性值 | 
| set(Object obj, Object value) | 設置obj中對應屬性值 | 
Method類
Method代表類的方法。
| 方法 | 用途 | 
| invoke(Object obj, Object... args) | 傳遞object對象及參數調用該對象對應的方法 | 
Constructor類
Constructor代表類的構造方法。
| 方法 | 用途 | 
| newInstance(Object... initargs) | 根據傳遞的參數創建類的對象 | 
示例
為了演示反射的使用,首先構造一個與書籍相關的model——Book.java,然后通過反射方法示例創建對象、反射私有構造方法、反射私有屬性、反射私有方法,最后給出兩個比較復雜的反射示例——獲得當前ZenMode和關機Shutdown。
被反射類Book.java
public class Book{
  private final static String TAG = "BookTag";
 
  private String name;
  private String author;
 
  @Override
  public String toString() {
    return "Book{" +
        "name='" + name + '\'' +
        ", author='" + author + '\'' +
        '}';
  }
 
  public Book() {
  }
 
  private Book(String name, String author) {
    this.name = name;
    this.author = author;
  }
 
  public String getName() {
    return name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
 
  public String getAuthor() {
    return author;
  }
 
  public void setAuthor(String author) {
    this.author = author;
  }
 
  private String declaredMethod(int index) {
    String string = null;
    switch (index) {
      case 0:
        string = "I am declaredMethod 1 !";
        break;
      case 1:
        string = "I am declaredMethod 2 !";
        break;
      default:
        string = "I am declaredMethod 1 !";
    }
 
    return string;
  }
}另外有需要云服務器可以了解下創新互聯建站www.yijiale78.com,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
                當前名稱:關于Java高級特性之反射的詳解-創新互聯
                
                標題URL:http://www.yijiale78.com/article4/cegooe.html
            
成都網站建設公司_創新互聯,為您提供網站收錄、網站策劃、響應式網站、品牌網站建設、虛擬主機、品牌網站設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯
