註解概述
- 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調用時不需要傳遞對象。
- 方法是靜態的,invoke調用時不需要傳遞對象。
-
調用參數是數組類型的方法
-
反射賦值案例
代理
newProxyInstance描述
invocationHandler詳解
- 是一個接口,接口中聲明瞭一個invoke()(與反射不同)方法,它是在代理對象調用行爲時會執行的方法,invoke方法有三個參數:
動態代理在開發中可以完成性能監控、權限控制、日誌記錄等操作。