Annotation--註解

1、synopsis

  註解,能夠看做是對 一個 類/方法 的一個擴展的模版,每一個 類/方法 按照註解類中的規則,來爲 類/方法 註解不一樣的參數,在用到的地方能夠獲得不一樣的 類/方法 中註解的各類參數與值
  註解也就是Annotation,相信很多人也和我以前同樣覺得和註釋和doc同樣,是一段輔助性的文字,其實註解不是這樣的。
  從JDK5開始,java增長了對元數據(描述數據屬性的信息)的支持。其實說白就是代碼裏的特殊標誌,這些標誌能夠在編譯,類加載,運行時被讀取,並執行相應的處理,以便於其餘工具補充信息或者進行部署。java

2、內置註解

一、@Override

  限定父類重寫方法程序員

二、@Deprecated

&emsp: 標誌方法已過期ide

三、@SupressWarning

  抑制編譯器警告函數

四、@SafeVarargs

  堆污染警告:把不帶泛型的對象賦給一個帶泛型的對象工具

五、@Functionallnterface

  函數式接口:若是接口中只有一個抽象方法(能夠包含多個默認方法或多個static方法)測試

3、自定義註解

一、syntax--語法

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
...  

public @interface MyAnnotation{ property//屬性; method//方法;}

二、analysis--解析

2.一、builtin annotation--元註解或內置註解

2.1.一、@Target--修飾那些程序單元

  @Target也只能修飾一個註解定義,做用是指定被修飾的註解能用於修飾哪些程序單元,@Target也包含了一個value值,他的值只能是下面的:ElementType.ui

取值 註解使用範圍
METHOD 可用於方法上
TYPE 可用於類或者接口上
ANNOTATION_TYPE 可用於註解類型上(被@interface修飾的類型)
CONSTRUCTOR 可用於構造方法上
FIELD 可用於域上
LOCAL_VARIABLE 可用於局部變量上
PACKAGE 用於記錄java文件的package信息
PARAMETER 可用於參數上

  例如:@Target(ElementType.METHOD)debug

2.1.二、@Rentention--被修飾的註解能夠保存位置

  這個註解是用來修飾註解定義的,做用是被修飾的註解能夠保存多久,這個註解須要使用參數。
  這個參數的類型是RetentionPolicy,因此使用這個註解就要對value賦值。
  value的值有且僅有三個:調試

  • RetenionPolicy.CLASS 編譯器把該註解記錄在class文件中。當運行java程序時,JVM不可獲取註解信息。這是默認值!
  • RetenionPolicy.RUNTIME編譯器把該註解記錄在class文件中。當運行java程序時,JVM可獲取註解信息,程序能夠經過反射獲取該註解信息
  • RetenionPolicy.SOURCE 該註解只保存在源代碼中,編譯器直接丟棄該註解

  例如:@Retention(RetenionPolicy.SOURCE)日誌

2.1.三、@Documented--被修飾的註解類將被javadoc工具提取成文檔

  這個註解用於指定被修飾的註解類將被javadoc工具提取成文檔,若是定義註解類時使用了這個註解修飾,則全部使用該註解修飾的程序員蘇API文檔將會包含該註解說明。
  例如:@Documentedpublic @interface Testable{}

2.1.四、@Inherited--被修飾的註解類將被子類繼承

  這個註解指定被他修飾的註解將具備繼承性——若是某個類使用了@Xxx,則其子類將自動被@Xxx修飾

2.1.五、@Result --相同類型註解使用屢次

  做用是在同一個程序元素前使用多個相同類型的註解在java8以前只能經過@Results配置,
  java8簡化了它的寫法例如:
  @test(age=5)@test(age=8)public void resultTest(){}

三、example--示例

  @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

相關文章
相關標籤/搜索