每天進步一點,不做curd工程師與Api調用工程師!
歡迎大家訪問我的博客:https://coder-programming.cn/
為了防止篇幅過長不易閱讀,在介紹Java注解時。分為兩篇文章進行詳細介紹。
內容如下
Java注解基本介紹
簡介
注解也叫元數據,例如我們常見的@Override和@Deprecated,注解是JDK1.5版本開始引入的一個特性,用于對代碼進行說明,可以對包、類、接口、字段、方法參數、局部變量等進行注解。
功能
- 作為特定的標記,用于告訴編譯器一些信息
- 編譯時動態處理,如動態生成代碼
- 運行時動態處理,作為額外信息的載體,如獲取注解信息
其中了解下XML與注解的區別:
注解:是一種分散式的元數據,與源代碼緊綁定。
XML:是一種集中式的元數據,與源代碼無綁定
分類
- 標準注解:
@Override
、@Deprecated
、@SuppresWarnings
- 元注解:
@Retention
、@Target
、@Inherited
、@Documented
- 自定義注解:可以根據自己的需求定義注解
注:
@Override(標明重寫某個方法)、
@Deprecated(標明某個類或方法過時)
@SuppressWarnings(標明要忽略的警告)
元注解詳細介紹
元注解的作用就是負責注解其他注解。Java5.0定義了4個標準的meta-annotation類型,它們被用來提供對其它 annotation類型作說明。Java5.0定義的元注解有以下幾種:
- @Target
- @Retention
- @Documented
- @Inherited
元注解 @Target
用于描述注解的范圍,即注解在哪用。它說明了Annotation所修飾的對象范圍:Annotation可被用于 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數)等。通過源碼我們可以看到取值類型(ElementType)有以下幾種:
package java.lang.annotation;
public enum ElementType {
TYPE, //用于描述類、接口(包括注解類型) 或enum聲明
FIELD, //用于描述域即類成員變量
METHOD, //用于描述方法
PARAMETER, //用于描述參數
CONSTRUCTOR, //用于描述構造器
LOCAL_VARIABLE, //用于描述局部變量
ANNOTATION_TYPE, //描述注解
PACKAGE,//用于描述包
TYPE_PARAMETER,//1.8版本開始,描述類、接口或enum參數的聲明
TYPE_USE, //1.8版本開始,描述一種類、接口或enum的使用聲明
MODULE; //表示作用在部分模塊中(Java9引入的概念)
private ElementType() {
}
}
舉例:
///表示Log注解可以用在類、接口、enum和方法上
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Log {
......
}
元注解 @Retention
用于描述注解的生命周期,表示需要在什么級別保存該注解,即保留的時間長短。取值類型(RetentionPolicy)有以下幾種:
- SOURCE:在源文件中有效(即源文件保留)
- CLASS:在class文件中有效(即class保留)
- RUNTIME:在運行時有效(即運行時保留)
舉例:
//使用RetentionPolicy.RUNTIME,這樣注解處理器可以通過反射,獲取到該注解的屬性值,從而去做一些運行時的邏輯處理。
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
......
}
元注解 @Documented
用于描述其它類型的annotation應該被作為被標注的程序成員的公共API,因此可以被例如javadoc此類的工具文檔化。它是一個標記注解,沒有成員。
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
......
}
元注解 @Inherited
用于表示某個被標注的類型是被繼承的。如果一個使用了@Inherited修飾的annotation類型被用于一個class,則這個annotation將被用于該class的子類。
文末
文章收錄至
Github: https://github.com/CoderMerlin/coder-programming
Gitee: https://gitee.com/573059382/coder-programming
歡迎關注并star~