Java的annotation功能
阿新 • • 發佈:2017-12-22
可選 成員 常量 ota res ack 添加 exce 有效
JDK1.5開始增加了Annotation功能,該功能可用於類、構造方法、成員變量、方法、參數等的聲明中。該功能不影響程序運行,但是會對編譯器警告等輔助工具產生影響。
一、定義一個Annotation
public @interface UserName{}
使用@interface關鍵字定義一個註解
二、添加成員
public @interface UserName{ String value(); }
成員類型支持:String\class\primitive\enumerated\annotation,以及所列類型的數組;
三、添加默認值
public @interfaceUserName{ String value() default "default value"; }
四、指定可註解的類型
@Target(ElementType.Method) public @interface UserName{}
適用於註解在方法上,例如:
Class Car{ @UserName(value = "laye") public void drive(){} }
ElementType的種類有:
- ANNOTATION_TYPE:表示用於Annotation類型;
- TYPE:表示用於類、接口、以及Annotation和枚舉類型;
- CONSTRUCTOR:表示用於構造方法;
- FIELD:表示用於成員變量和枚舉常量;
- METHOD:表示用於方法;
- PARAMETER:表示用於參數;
- LOCAL_VARIABLE:表示用於局部變量;
- PACKAGE:表示用於包;
五、指定註解的有效範圍
@Retention(RetentionPolicy.RUNTIME) public @interface UserName{}
表示在運行時有效,RetentionPolicy可選類型如下:
- SOURCE:表示不編譯到類文件中;
- CLASS:表示編譯到類文件,但運行時不加載;
- 表示在運行時加載;
六、訪問註解
java.lang.reflect包下有一個類:AccesibleObject,它時Method\Field\Constructor的父類,同時它又實現了AnnotatedElement接口。因此,Method\Field\Constructor包含了訪問註解的接口方法;
具體例子如下:
@Target(ElementType.FIELD) // 註解類型為變量 @Retention(RetentionPolicy.RUNTIME) // 有效範圍為運行時 public @inteface UserName{ // 聲明註解 String value() default "no body"; // 添加成員 } class Car{ @UserName(value = "lay") // 註解在變量上 public String owner; // 默認值 public static void main(String[] args) throws Exception{ Class c = Car.class; // 獲取類類型 Field field = c.getField("owner"); // 獲取對應變量 UserName userName = (UserName)field.getAnnotation(UserName.class); // 獲取註解 System.out.println(userName.value()); // 獲取註解的成員變量 Car car = new Car(); // 獲取實例 field.set(car, userName.value()); // 設置實例的owner變量的值 } }
以上是一個訪問field的示例,method和constructor等類同這樣的寫法;
常用方法:
- isAnnotationPresent(Class class):是否添加了指定類型的註解;
- getAnnotation(Class class): 獲取指定類型的註解;
- getAnnotations(): 獲取所有類型的註解;
- getParameterAnnotations(): 獲取所有參數的註解;
Java的annotation功能