前言
上一篇對註解是什麼和其原理做了簡單的介紹(傳送門),本篇手寫實現一個簡單的註解示例。
註解的使用場景
對註解有了一定的熟悉之後,那麼註解到底有什麼用呢?
java官網定義:
註解是一系列元數據,它提供數據用來解釋程序代碼,但是註解並非是所解釋的代碼本身的一部分。註解對於代碼的運行效果沒有直接影響。
註解有許多用處,主要如下:
- 提供信息給編譯器: 編譯器可以利用註解來探測錯誤和警告信息
- 編譯階段時的處理: 軟件工具可以用來利用註解信息來生成代碼、Html文檔或者做其它相應處理。
- 運行時的處理: 某些註解可以在程序運行的時候接受代碼的提取
註解並非是所解釋的代碼本身的一部分,即註解起的作用類似於標籤,不改變其本身,只是針對特定事物的功能。當開發者使用了Annotation 修飾了類、方法、Field 等成員之後,這些 Annotation 不會自己生效,必須由開發者提供相應的代碼來提取並處理 Annotation 信息。這些處理提取和處理 Annotation 的代碼統稱爲 APT(Annotation Processing Tool)。
手寫註解
需求: 一個計算類具有加減乘除方法,當執行方法時要檢查其有沒有使程序產生異常,如果有則將異常信息顯示。
註解類
@Retention(RetentionPolicy.RUNTIME)
public @interface Check {
}
計算類
計算類(Numeration )定義加減乘除,四個方法,其中除法除數爲0,此處會有異常發生。
public class Numeration {
//加法
@Check
public void add() {
System.out.println("1+1=" + 1 + 1);
}
//減法
@Check
public void subtract() {
System.out.println("1-1=" + (1 - 1));
}
//乘法
@Check
public void multiply() {
System.out.println("1*2=" + (1 *2));
}
//除法
@Check
public void divide() {
System.out.println("1/0=" + 1 /0);
}
}
測試類
public class testAnn {
public static void main(String[] args) {
//實例化計算類
Numeration numeration = new Numeration();
//使用反射獲取到計算類的方法數組
Method[] methods = numeration.getClass().getDeclaredMethods();
//使用StringBuilder來記錄日誌
StringBuilder sb = new StringBuilder();
//error用來記錄出錯次數
AtomicInteger error = new AtomicInteger();
//使用lambda循環遍歷methods
Arrays.asList(methods).forEach((
method -> {
//檢測方法上是否有@Check註解
if (method.isAnnotationPresent(Check.class)) {
try {
//設置方法的訪問權限爲true
method.setAccessible(true);
//調用numeration中方法
method.invoke(numeration, null);
} catch (IllegalAccessException e) {
// e.printStackTrace();
} catch (InvocationTargetException e) {
// e.printStackTrace();
//當調用出現異常時,使用StringBuilder收集數據
error.getAndIncrement();
sb.append("類名爲")
.append(method.getClass())
.append(" "+"原因爲:")
.append(e.getCause().getMessage());
}
}
}
));
sb.append(" "+"錯誤次數爲:")
.append(error);
System.out.println(sb);
}
}
輸出結果
1+1=11
1*2=2
1-1=0
類名爲class java.lang.reflect.Method 原因爲:/ by zero 錯誤次數爲:1
一個簡單的自定義註解實現~