java自定義註解和使用

前言

上一篇對註解是什麼和其原理做了簡單的介紹(傳送門),本篇手寫實現一個簡單的註解示例。

註解的使用場景

對註解有了一定的熟悉之後,那麼註解到底有什麼用呢?

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

一個簡單的自定義註解實現~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章