以前對于這兩個概念其實沒有多少認識,只知道注解是標記,對于反射的印象就是類比于游戲進度的回顯吧,慚愧慚愧~~~學習后有了一些更深入的了解,記錄一下,加深印象,
注解(Annotation)
-
什么是注解?
是 JDK5.0 引入的一種注釋機制,代碼輔助工具,由內置注解和元注解組成,核心作用是對類、方法、變數、引數和包進行標注,通過反射來訪問標注資訊,以此在運行中改變標注物件的行為, -
內置注解
@Override(重寫方法):被用于標注方法,用于說明所標注的方法是重寫父類的方法
@Deprecated(過時方法):用于說明所標注元素,因存在安全問題或有更好選擇而不鼓勵使用,如果強行使用,則編譯器會發出警告
@SuppressWarnings(消除警告):用于取消編輯器所顯示的警告,有如下屬性值
@SafeVarargs(消除泛型警告) : Java 7 開始支持,忽略任何使用引數為泛型變數的方法或建構式呼叫產生的警告
@FunctionalInterface (標記函式): Java 8 開始支持,標識一個匿名函式或函式式介面
@Repeatable(多次宣告) : Java 8 開始支持,標識某注解可以在同一個宣告上使用多次
-
元注解:java提供了四個用于修飾自定義注解的元注解
@Target:用于指定被修飾的自定義注解只能用于修飾程式中哪些元素
ElemenetType.CONSTRUCTOR:構造器宣告
ElemenetType.LOCAL_VARIABLE:區域變數宣告
ElemenetType.PACKAGE:包宣告
ElemenetType.PARAMETER :引數宣告
ElemenetType.METHOD :方法宣告
ElemenetType.FIELD:全域屬性宣告(包括 enum 實體)
ElemenetType.TYPE:類,介面(包括注解型別)或enum宣告@Retention:用于指定被修飾的自定義注解可以保留多久,有三個常用屬性
RetentionPolicy.SOURCE:在源檔案中有效(即源檔案保留)
RetentionPolicy.CLASS:在class檔案中有效(即class保留)
RetentionPolicy.RUNTIME:在運行時有效(即運行時保留)@Documented:執行javadoc命令時,被該元注解修飾的自定義注解也會生成在檔案中
@Inherited:如果父類所使用的注解有此修飾,則子類可以繼承該注解,否則不能
-
自定義注解實體
1 @Target({ElementType.FIELD,ElementType.TYPE})//可修飾屬性和類 2 @Retention(RetentionPolicy.RUNTIME)//運行時 3 public @interface RefStudy { 4 5 String name() default "a"; 6 String[] mores(); 7 }
反射(reflection)
- 反射是什么?
運行程序中,對于任意類,都能知道類的所有屬性和方法;對弈任意物件,都能呼叫它的方法和屬性,這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為Java語言的反射, - 反射的優缺點
- 反射提高了程式的靈活性和擴展性,降低耦合性,提高自適應能力
- 它允許程式創建和控制任何類的物件,無需提前硬編碼目標類
- 反射會對性能造成一定的影響,同時讓代碼的可讀性變低
- 常用方法
方法名 回傳值 引數描述 Class.forName(String) 類的元資訊 類檔案的具體位置 類.getClass() 類的元資訊 clz.getDeclaredFields() 類中的所有屬性 getMethods() 類的所有方法 invoke(obj) 通過反射執行方法 類的元資訊 getAnnotation(class) 注解 類的Class setAccessible(true) 設定當前屬性為可見 true或者false clz.newInstance() 類的實體物件
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168600.html
標籤:Java
