Java實現自定義註解

前言

     上一篇文章介紹了註解的一些基本知識,這次來介紹下如何實現自定義註解及註解如何使用。

正文

     註解是一種能被添加到java源代碼中的元數據,方法、類、參數和包都可以用註解來修飾。註解可以看作是一種特殊的標記,可以用在方法、類、參數和包上,程序在編譯或者運行時可以檢測到這些標記而進行一些特殊的處理。

註解的基本元素

     聲明一個註解要用到的東西

  • 修飾符
      訪問修飾符必須爲public,不寫默認爲pubic;
  • 關鍵字
      關鍵字爲@interface;
  • 註解名稱
      註解名稱爲自定義註解的名稱,使用時還會用到;
  • 註解類型元素
      註解類型元素是註解中內容,可以理解成自定義接口的實現部分;
public @interface Info {
    String value() default "tracy";
    boolean isDelete();
}

使用元註解修飾註解

     JDK中有一些元註解,主要有@Target,@Retention,@Document,@Inherited用來修飾註解。
@Target
  表明該註解可以應用的java元素類型

Target類型 描述
ElementType.TYPE 應用於類、接口(包括註解類型)、枚舉
ElementType.FIELD 應用於屬性(包括枚舉中的常量)
ElementType.METHOD 應用於方法
ElementType.PARAMETER 應用於方法的形參
ElementType.CONSTRUCTOR 應用於構造函數
ElementType.LOCAL_VARIABLE 應用於局部變量
ElementType.ANNOTATION_TYPE 應用於註解類型
ElementType.PACKAGE 應用於包
ElementType.TYPE_PARAMETER 1.8版本新增,應用於類型變量)
ElementType.TYPE_USE 1.8版本新增,應用於任何使用類型的語句中(例如聲明語句、泛型和強制轉換語句中的類型)

@Retention
  表明該註解的生命週期

生命週期類型 描述
RetentionPolicy.SOURCE 編譯時被丟棄,不包含在類文件中
RetentionPolicy.CLASS JVM加載時被丟棄,包含在類文件中,默認值
RetentionPolicy.RUNTIME 由JVM 加載,包含在類文件中,在運行時可以被獲取到

@Document
  表明該註解標記的元素可以被Javadoc 或類似的工具文檔化
@Inherited
  表明使用了@Inherited註解的註解,所標記的類的子類也會擁有這個註解

@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Info {
      String value() default "tracy";
      boolean isDelete();
}

使用自定義註解

配置註解

    定義了一個Person類

@Data
@Builder
// 爲Person類配置了剛剛定義的註解@Info
@Info(isDelete = true)
public class Person {

    /**
     * 姓名
     */
    private String name;

    /**
     * 年齡
     */
    private int age;

    /**
     * 是否有效
     */
    private boolean isDelete;
}

利用反射解析註解


public class AnnotationTest {
    public static void main(String[] args) {
        try {
            //獲取Person的Class對象
            Person person = Person.builder().build();
            Class clazz = person.getClass();
            //判斷person對象上是否有Info註解
            if (clazz.isAnnotationPresent(Info.class)) {
                System.out.println("Person類上配置了Info註解!");
                //獲取該對象上Info類型的註解
                Info infoAnno = (Info) clazz.getAnnotation(Info.class);
                System.out.println("person.name :" + infoAnno.value() + ",person.isDelete:" + infoAnno.isDelete());
            } else {
                System.out.println("Person類上沒有配置Info註解!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

    運行結果:
在這裏插入圖片描述
    對於一個類或者接口來說,Class類(java.lang包下)中提供了一些方法用於反射註解,當然對於字段、方法來說反射註解的方式很類似。

//返回指定的註解
getAnnotation
//判斷當前元素是否被指定註解修飾
isAnnotationPresent
//返回所有的註解
getAnnotations

參考文章

https://blog.csdn.net/xsp_happyboy/article/details/80987484
https://blog.csdn.net/Dufresne311/article/details/83116020
https://segmentfault.com/a/1190000018209300

總結

     Java 中自定義註解的實現就先介紹到這裏了,感謝閱讀~

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