c JAVA 注解,Java元注解作用及使用
元注解是負責對其它注解進行說明的注解,自定義注解時可以使用元注解。Java 5 定義了 4 個注解,分別是 @Documented、@Target、@Retention 和 @Inherited。Java 8 又增加了 @Repeatable 和 @Native 兩個注解。這些注解都可以在 java.lang.annotation 包中找到。下面主要介紹每個元注解的作用及使用。
本節示例會用到自定義注解,不了解可先閱讀學習《Java自定義注解》一節。
@Documented
@Documented 是一個標記注解,沒有成員變量。用 @Documented 注解修飾的注解類會被 JavaDoc 工具提取成文檔。默認情況下,JavaDoc 是不包括注解的,但如果聲明注解時指定了 @Documented,就會被 JavaDoc 之類的工具處理,所以注解類型信息就會被包括在生成的幫助文檔中。
下面通過示例來了解它的用法,代碼如下所示。
例 1
@Documented
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface MyDocumented {
public String value() default "這是@Documented注解";
}
測試類:
@MyDocumented
public class DocumentedTest {
/**
* 測試document
*/
@MyDocumented
public String Test() {
return "C語言中文網Java教程";
}
}
打開 Java 文件所在的目錄,分別輸入如下兩條命令行:
javac MyDocumented.java DocumentedTest.java
javadoc -d doc MyDocumented.java DocumentedTest.java
運行成功后,打開生成的幫助文檔,可以看到在類和方法上都保留了 MyDocument 的注解信息。如下圖所示:
@Target
@Target 注解用來指定一個注解的使用范圍,即被 @Target 修飾的注解可以用在什么地方。@Target 注解有一個成員變量(value)用來設置適用目標,value 是 java.lang.annotation.ElementType 枚舉類型的數組,下表為 ElementType 常用的枚舉常量。
名稱
說明
CONSTRUCTOR
用于構造方法
FIELD
用于成員變量(包括枚舉常量)
LOCAL_VARIABLE
用于局部變量
METHOD
用于方法
PACKAGE
用于包
PARAMETER
用于類型參數(JDK 1.8新增)
TYPE
用于類、接口(包括注解類型)或 enum 聲明
例 2
自定義一個 MyTarget 注解,使用范圍為方法,代碼如下所示。
@Target({ ElementType.METHOD })
public @interface MyTarget {
}
class Test {
@MyTarget
String name;
}
如上代碼第 6 行會編譯錯誤,錯誤信息為:
The annotation @MyTarget is disallowed for this location
提示此位置不允許使用注解 @MyDocumented,@MyTarget 不能修飾成員變量,只能修飾方法。
@Retention
@Retention 用于描述注解的生命周期,也就是該注解被保留的時間長短。@Retention 注解中的成員變量(value)用來設置保留策略,value 是 java.lang.annotation.RetentionPolicy 枚舉類型,RetentionPolicy 有 3 個枚舉常量,如下所示。
SOURCE:在源文件中有效(即源文件保留)
CLASS:在 class 文件中有效(即 class 保留)
RUNTIME:在運行時有效(即運行時保留)
生命周期大小排序為 SOURCE < CLASS < RUNTIME,前者能使用的地方后者一定也能使用。如果需要在運行時去動態獲取注解信息,那只能用 RUNTIME 注解;如果要在編譯時進行一些預處理操作,比如生成一些輔助代碼(如 ButterKnife),就用 CLASS 注解;如果只是做一些檢查性的操作,比如 @Override 和 @SuppressWarnings,則可選用 SOURCE 注解。
@Inherited
@Inherited 是一個標記注解,用來指定該注解可以被繼承。使用 @Inherited 注解的 Class 類,表示這個注解可以被用于該 Class 類的子類。就是說如果某個類使用了被?@Inherited 修飾的注解,則其子類將自動具有該注解。
例 3
創建一個自定義注解,代碼如下所示:
@Target({ ElementType.TYPE })
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyInherited {
}
測試類代碼如下:
@MyInherited
public class TestA {
public static void main(String[] args) {
System.out.println(TestA.class.getAnnotation(MyInherited.class));
System.out.println(TestB.class.getAnnotation(MyInherited.class));
System.out.println(TestC.class.getAnnotation(MyInherited.class));
}
}
class TestB extends TestA {
}
class TestC extends TestB {
}
運行結果為:
@MyInherited()
@MyInherited()
@MyInherited()
@Repeatable
@Repeatable 注解是 Java 8 新增加的,它允許在相同的程序元素中重復注解,在需要對同一種注解多次使用時,往往需要借助 @Repeatable 注解。Java 8 版本以前,同一個程序元素前最多只能有一個相同類型的注解,如果需要在同一個元素前使用多個相同類型的注解,則必須使用注解“容器”。
例 4
Java 8 之前的做法:
public @interface Roles {
Role[] roles();
}
public @interface Roles {
Role[] value();
}
public class RoleTest {
@Roles(roles = {@Role(roleName = "role1"), @Role(roleName = "role2")})
public String doString(){
return "這是C語言中國網Java教程";
}
}
Java 8 之后增加了重復注解,使用方式如下:
public @interface Roles {
Role[] value();
}
@Repeatable(Roles.class)
public @interface Role {
String roleName();
}
public class RoleTest {
@Role(roleName = "role1")
@Role(roleName = "role2")
public String doString(){
return "這是C語言中文網Java教程";
}
}
不同的地方是,創建重復注解 Role 時加上了 @Repeatable 注解,指向存儲注解 Roles,這樣在使用時就可以直接重復使用 Role 注解。從上面例子看出,使用 @Repeatable 注解更符合常規思維,可讀性強一點。
兩種方法獲得的效果相同。重復注解只是一種簡化寫法,這種簡化寫法是一種假象,多個重復注解其實會被作為“容器”注解的 value 成員的數組元素處理。
@Native
使用 @Native 注解修飾成員變量,則表示這個變量可以被本地代碼引用,常常被代碼生成工具使用。對于 @Native 注解不常使用,了解即可。
總結
以上是生活随笔為你收集整理的c JAVA 注解,Java元注解作用及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php+spl+栈,PHP SPL标准库
- 下一篇: createinstance.java,