以前對於這兩個概念其實沒有多少認識,只知道註解是標記,對於反射的印象就是類比於游戲進度的回顯吧,慚愧慚愧~~~學習後有了一些更深入的瞭解,記錄一下,加深印象。 註解(Annotation) 什麼是註解? 是 JDK5.0 引入的一種註釋機制,代碼輔助工具,由內置註解和元註解組成。核心作用是對類、方法 ...
以前對於這兩個概念其實沒有多少認識,只知道註解是標記,對於反射的印象就是類比於游戲進度的回顯吧,慚愧慚愧~~~學習後有了一些更深入的瞭解,記錄一下,加深印象。
註解(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() 類的實例對象