前言
上一篇文章介紹了註解的一些基本知識,這次來介紹下如何實現自定義註解及註解如何使用。
正文
註解是一種能被添加到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 中自定義註解的實現就先介紹到這裏了,感謝閱讀~