java註解學習

01-參考鏈接1-csdnjava註解-最通俗易懂的講解

1 java註解

  • what:又稱 Java 標註,是 JDK5.0 引入的一種註釋機制。Java 語言中的類、方法、變量、參數和包等都可以被標註。----java類、方法、變量、參數和包的標籤

2 元註解

元註解是可以註解到註解上的註解,或者說元註解是一種基本註解,但是它能夠應用到其它的註解上面。

元註解有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 種。

  • @Retention:Retention 的英文意爲保留期的意思。說明註解的保存時間;
    • RetentionPolicy.SOURCE 註解只在源碼階段保留,在編譯器進行編譯時它將被丟棄忽視。
    • RetentionPolicy.CLASS 註解只被保留到編譯進行的時候,它並不會被加載到 JVM 中。
    • RetentionPolicy.RUNTIME 註解可以保留到程序運行的時候,它會被加載進入到 JVM 中,所以在程序運行時可以獲取到它們。
  • @Documented:它的作用是能夠將註解中的元素包含到 Javadoc 中去;
  • @Target :限定註解的應用目標和場景;
    • ElementType.ANNOTATION_TYPE 可以給一個註解進行註解
    • ElementType.CONSTRUCTOR 可以給構造方法進行註解
    • ElementType.FIELD 可以給屬性進行註解
    • ElementType.LOCAL_VARIABLE 可以給局部變量進行註解
    • ElementType.METHOD 可以給方法進行註解
    • ElementType.PACKAGE 可以給一個包進行註解
    • ElementType.PARAMETER 可以給一個方法內的參數進行註解
    • ElementType.TYPE 可以給一個類型進行註解,比如類、接口、枚舉
  • @Inherited:Inherited 是繼承的意思,但是它並不是說註解本身可以繼承,而是說如果一個超類被 @Inherited 註解過的註解進行註解的話,那麼如果它的子類沒有被任何註解應用的話,那麼這個子類就繼承了超類的註解。
  • @Repeatable:表示註解可以重複使用;

3 註解屬性

註解的屬性就是註解的成員變量;註解的成員變量在註解的定義中以“無形參的方法”形式來聲明,其方法名定義了該成員變量的名字,其返回值定義了該成員變量的類型。

在註解中定義屬性時它的類型必須是 8 種基本數據類型外加 類、接口、註解及它們的數組。

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

4 提取註解

註解通過反射獲取。首先可以通過 Class 對象的 isAnnotationPresent() 方法判斷它是否應用了某個註解

public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}
1

然後通過 getAnnotation() 方法來獲取 Annotation 對象。

 public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}
1

或者是 getAnnotations() 方法。

public Annotation[] getAnnotations() {}

5 註解應用

註解是一系列元數據,它提供數據用來解釋程序代碼,但是註解並非是所解釋的代碼本身的一部分。註解對於代碼的運行效果沒有直接影響。

註解有許多用處,主要如下:

  • 提供信息給編譯器: 編譯器可以利用註解來探測錯誤和警告信息
  • 編譯階段時的處理: 軟件工具可以用來利用註解信息來生成代碼、Html文檔或者做其它相應處理。
  • 運行時的處理: 某些註解可以在程序運行的時候接受代碼的提取
    值得注意的是,註解不是代碼本身的一部分。

6 一個輕鬆場景

來自-csdnjava註解-最通俗易懂的講解

我要寫一個測試框架,測試程序員的代碼有無明顯的異常。

—— 程序員 A : 我寫了一個類,它的名字叫做 NoBug,因爲它所有的方法都沒有錯誤。
—— 我:自信是好事,不過爲了防止意外,讓我測試一下如何?
—— 程序員 A: 怎麼測試?
—— 我:把你寫的代碼的方法都加上 @Jiecha 這個註解就好了。
—— 程序員 A: 好的。

package ceshi;
import ceshi.Jiecha;
public class NoBug {
    @Jiecha
    public void suanShu(){
        System.out.println("1234567890");
    }
    @Jiecha
    public void jiafa(){
        System.out.println("1+1="+1+1);
    }
    @Jiecha
    public void jiefa(){
        System.out.println("1-1="+(1-1));
    }
    @Jiecha
    public void chengfa(){
        System.out.println("3 x 5="+ 3*5);
    }
    @Jiecha
    public void chufa(){
        System.out.println("6 / 0="+ 6 / 0);
    }
    public void ziwojieshao(){
        System.out.println("我寫的程序沒有 bug!");
    }
}
1

上面的代碼,有些方法上面運用了 @Jiecha 註解。

這個註解是我寫的測試軟件框架中定義的註解。

package ceshi;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Jiecha {
}
1

然後,我再編寫一個測試類 TestTool 就可以測試 NoBug 相應的方法了。

package ceshi;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestTool {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        NoBug testobj = new NoBug();
        Class clazz = testobj.getClass();
        Method[] method = clazz.getDeclaredMethods();
        //用來記錄測試產生的 log 信息
        StringBuilder log = new StringBuilder();
        // 記錄異常的次數
        int errornum = 0;
        for ( Method m: method ) {
            // 只有被 @Jiecha 標註過的方法才進行測試
            if ( m.isAnnotationPresent( Jiecha.class )) {
                try {
                    m.setAccessible(true);
                    m.invoke(testobj, null);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    //e.printStackTrace();
                    errornum++;
                    log.append(m.getName());
                    log.append(" ");
                    log.append("has error:");
                    log.append("\n\r  caused by ");
                    //記錄測試過程中,發生的異常的名稱
                    log.append(e.getCause().getClass().getSimpleName());
                    log.append("\n\r");
                    //記錄測試過程中,發生的異常的具體信息
                    log.append(e.getCause().getMessage());
                    log.append("\n\r");
                } 
            }
        }
        log.append(clazz.getSimpleName());
        log.append(" has  ");
        log.append(errornum);
        log.append(" error.");
        // 生成測試報告
        System.out.println(log.toString());
    }
}
1

測試的結果是:

1234567890
1+1=11
1-1=0
3 x 5=15
chufa has error:
  caused by ArithmeticException
/ by zero
NoBug has  1 error.
1

提示 NoBug 類中的 chufa() 這個方法有異常,這個異常名稱叫做 ArithmeticException,原因是運算過程中進行了除 0 的操作。

所以,NoBug 這個類有 Bug。

這樣,通過註解我完成了我自己的目的,那就是對別人的代碼進行測試。

所以,再問我註解什麼時候用?我只能告訴你,這取決於你想利用它幹什麼用。

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