註解,能夠看做是對 一個 類/方法 的一個擴展的模版,每一個 類/方法 按照註解類中的規則,來爲 類/方法 註解不一樣的參數,在用到的地方能夠獲得不一樣的 類/方法 中註解的各類參數與值
註解也就是Annotation,相信很多人也和我以前同樣覺得和註釋和doc同樣,是一段輔助性的文字,其實註解不是這樣的。
從JDK5開始,java增長了對元數據(描述數據屬性的信息)的支持。其實說白就是代碼裏的特殊標誌,這些標誌能夠在編譯,類加載,運行時被讀取,並執行相應的處理,以便於其餘工具補充信息或者進行部署。java
限定父類重寫方法程序員
&emsp: 標誌方法已過期ide
抑制編譯器警告函數
堆污染警告:把不帶泛型的對象賦給一個帶泛型的對象工具
函數式接口:若是接口中只有一個抽象方法(能夠包含多個默認方法或多個static方法)測試
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) ... public @interface MyAnnotation{ property//屬性; method//方法;}
@Target也只能修飾一個註解定義,做用是指定被修飾的註解能用於修飾哪些程序單元,@Target也包含了一個value值,他的值只能是下面的:ElementType.ui
取值 | 註解使用範圍 |
---|---|
METHOD | 可用於方法上 |
TYPE | 可用於類或者接口上 |
ANNOTATION_TYPE | 可用於註解類型上(被@interface修飾的類型) |
CONSTRUCTOR | 可用於構造方法上 |
FIELD | 可用於域上 |
LOCAL_VARIABLE | 可用於局部變量上 |
PACKAGE | 用於記錄java文件的package信息 |
PARAMETER | 可用於參數上 |
例如:@Target(ElementType.METHOD)
debug
這個註解是用來修飾註解定義的,做用是被修飾的註解能夠保存多久,這個註解須要使用參數。
這個參數的類型是RetentionPolicy,因此使用這個註解就要對value賦值。
value的值有且僅有三個:調試
例如:@Retention(RetenionPolicy.SOURCE)
日誌
這個註解用於指定被修飾的註解類將被javadoc工具提取成文檔,若是定義註解類時使用了這個註解修飾,則全部使用該註解修飾的程序員蘇API文檔將會包含該註解說明。
例如:@Documentedpublic @interface Testable{}
這個註解指定被他修飾的註解將具備繼承性——若是某個類使用了@Xxx,則其子類將自動被@Xxx修飾
做用是在同一個程序元素前使用多個相同類型的註解在java8以前只能經過@Results配置,
java8簡化了它的寫法例如:
@test(age=5)@test(age=8)public void resultTest(){}
@Check註解類
package mannotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @auth Administrator * @date 2019-06-01 09:36 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Check { }
Calculator類
package mannotation; /** * 簡單模擬計算器類 * @auth Administrator * @date 2019-06-01 09:48 */ public class Calculator { /** * addition */ @Check public void add() { System.out.println("1+0="+(1+0)); String s = null; s.length(); } /** * subtraction */ @Check public void sub() { System.out.println("1-0="+(1-0)); } /** * multiplication */ @Check public void mul() { System.out.println("1*0="+(1*0)); } /** * division */ @Check public void div() { System.out.println("1/0="+(1/0)); } }
CalculatorTest類
package mannotation; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 測試文件 * @auth Administrator * @date 2019-06-01 10:00 */ public class CalculatorTest { public static void main(String[] args) throws IOException { int exces = 0;//出現異常次數 // 一、新建計算器類對象 Calculator cl = new Calculator(); // 二、獲取計算器類的字節碼對象 Class ca = Calculator.class; // 三、獲取全部方法 Method[] methods = ca.getDeclaredMethods(); // 四、過濾帶有註解類@check的方法 // 五、將調試信息打印到日誌文件cal_debug.log中 // 5.一、獲取日誌文件cal_debug.log輸入流 BufferedWriter bw = new BufferedWriter(new FileWriter("cal_debug.log")); for (Method method: methods) { if (method.isAnnotationPresent(Check.class)) { try { method.invoke(cl); } catch (Exception e) { exces++; bw.write("method "+method.getName()+" 出現異常"); bw.newLine(); bw.write("exception name:"+e.getCause().getClass().getSimpleName()); bw.newLine(); bw.write("exception type:"+e.getCause().getMessage()); bw.newLine(); bw.write("------------------------------"); } } } bw.newLine(); bw.write("exception counts:"+exces); bw.close(); } }
測試結果:cal_debug.log內容
method add 出現異常 exception name:NullPointerException exception type:null ------------------------------method div 出現異常 exception name:ArithmeticException exception type:/ by zero ------------------------------ exception counts:2
參考文檔:https://baike.baidu.com/item/%E6%B3%A8%E8%A7%A3/22344968
參考視頻:
諮詢郵箱:gaogzhen@foxmail.com