17、註解和反射

註解概述

  • Annotation註解,也叫元數據。
  • 作用:編寫文檔、代碼分析、編譯檢查。現在開發中,用註解替換xml配置文件。
  • 格式:“@註釋名”,還可以添加一些參數值。通過反射機制編程實現對這些元數據的訪問。
    在這裏插入圖片描述

基本內置註解

  • @Override:需要重寫
  • @Deprecated:不建議使用
  • @SuppresWarnings:有參數,去掉程序中的警告

註解聲明、本質和成員

  • 聲明註解
    public @interface MyAnnotation{ }
  • 註解的本質就是一個interface。
    在這裏插入圖片描述

註解屬性類型

  • 基本數據類型(四類八種)
  • String類型
  • 枚舉類型(enmu)
  • 註解類型
  • Class類型
  • 以上類型的一維數組類型
    在這裏插入圖片描述

註解屬性的使用

  • 如果一個註解有屬性,那麼在使用註解時,要對屬性進行賦值操作。
  • 如果一個註解的屬性有多個,都需要賦值。
  • 可以給屬性賦默認值(註解處用default)。
  • 如果屬性是數組類型:①可以直接使用 屬性名={ };②數組值只有一個時可以省略“{}”。
  • 對於屬性名稱value的操作:
    在這裏插入圖片描述

元註解

用於修飾註解的註解,用於描述註解在什麼範圍及什麼階段使用。
四個元註解介紹:

  • @Retention:指定註解信息在哪個階段存在。
    • SOURCE:編譯階段;
    • CLASS:解析執行階段;
    • RUNTIME:在JVM中。
  • @Target:標註註解的執行位置(ElementType.XXX)。
  • @Document:生成註解信息到javadoc文檔中。
  • @InHerited:讓註解有自動繼承性。
  • @Retention的值應該是RUNTIME,因爲會結合反射技術來使用;@Target一般使用TYPE或METHOD。

反射介紹

反射,一種計算機處理方式,對於任一對象,都能動態獲取信息以及動態調用對象方法功能。
在這裏插入圖片描述
反射的優缺點:

  • 優點:
    • 提高了程序的靈活性和擴展性;
    • 降低耦合性,提高自適應能力;
    • 允許程序創建和控制任何類的對象,無需提前硬編碼目標類。
  • 缺點:
    • 性能問題:反射機制應用在對靈活性和拓展性要求很高的系統框架上,普通程序不建議使用。
    • 反射會模糊程序內部邏輯,帶來維護問題。

反射的API

  • Class介紹及獲取
    java中的Class可以代表任意的類或者接口類型。
    如何獲取一個Class?
    • 如果有一個對象,可以直接通過從Object類中繼承的getClass方法獲取;
    • 可以通過類包(接口)直接調用其屬性.class獲取;
    • (推薦,無耦合)Class.forName()
      在這裏插入圖片描述

爲什麼要獲得Class?
反射操作中會獲取類的成員,Constructor、Filed、Method,需要通過Class來獲得其他對象。

  • Constructor
    單個構造器,得到它就可以實例化對象。
    • getConstructor獲取類的public構造;
    • getConstructors獲取類的所有public構造;
    • getDeclaredConstructor獲取類的private構造;
    • getDeclaredConstructors獲取類的所有private構造。
      在這裏插入圖片描述
  • Filed
    如何獲取Filed?
    • getFiled獲取類的public屬性;
    • getFileds獲取類的所有public屬性;
    • getDeclaredFiled獲取類的private屬性;
    • getDeclaredFileds獲取類的所有private屬性。
      賦值、取值操作
      在這裏插入圖片描述
  • Method
    如何獲取一個Mehod對象?
    • getMethod獲取類的方法,包括父類的;

    • getMethods獲取類的所有方法,包括父類的;

    • getDeclaredMethod獲取僅本類的方法;

    • getDeclaredMethods獲取僅本類的所有方法。
      在這裏插入圖片描述

    • 執行方法,invoke
      在這裏插入圖片描述

    • Method的invoke使用注意事項

    • 調用static方法

      • 方法是靜態的,invoke調用時不需要傳遞對象。
        在這裏插入圖片描述
    • 調用參數是數組類型的方法

      在這裏插入圖片描述
      在這裏插入圖片描述

反射賦值案例

在這裏插入圖片描述

代理

在這裏插入圖片描述
newProxyInstance描述
在這裏插入圖片描述
invocationHandler詳解

  • 是一個接口,接口中聲明瞭一個invoke()(與反射不同)方法,它是在代理對象調用行爲時會執行的方法,invoke方法有三個參數:
    在這裏插入圖片描述

動態代理在開發中可以完成性能監控、權限控制、日誌記錄等操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章