註解與反射

wangyudong927發表於2022-01-04

註解概述

  • 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方法有三個引數:
    在這裡插入圖片描述

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

建立物件的4種方式

  • new關鍵字
  • clone()方法
  • 反序列化:objectInputStream.readObject()
  • 反射:Class.newInstence()

相關文章