1. 程式人生 > >Java的annotation功能

Java的annotation功能

可選 成員 常量 ota res ack 添加 exce 有效

JDK1.5開始增加了Annotation功能,該功能可用於類、構造方法、成員變量、方法、參數等的聲明中。該功能不影響程序運行,但是會對編譯器警告等輔助工具產生影響。

一、定義一個Annotation

public @interface UserName{}

使用@interface關鍵字定義一個註解

二、添加成員

public @interface UserName{
    String value();  
}

成員類型支持:String\class\primitive\enumerated\annotation,以及所列類型的數組;

三、添加默認值

public @interface
UserName{ String value() default "default value"; }

四、指定可註解的類型

@Target(ElementType.Method) 
public @interface UserName{}

適用於註解在方法上,例如:

Class Car{
    @UserName(value = "laye")
    public void drive(){}  
}

ElementType的種類有:

  1. ANNOTATION_TYPE:表示用於Annotation類型;
  2. TYPE:表示用於類、接口、以及Annotation和枚舉類型;
  3. CONSTRUCTOR:表示用於構造方法;
  4. FIELD:表示用於成員變量和枚舉常量;
  5. METHOD:表示用於方法;
  6. PARAMETER:表示用於參數;
  7. LOCAL_VARIABLE:表示用於局部變量;
  8. PACKAGE:表示用於包;

五、指定註解的有效範圍

@Retention(RetentionPolicy.RUNTIME)
public @interface UserName{}

表示在運行時有效,RetentionPolicy可選類型如下:

  1. SOURCE:表示不編譯到類文件中;
  2. CLASS:表示編譯到類文件,但運行時不加載;
  3. 表示在運行時加載;

六、訪問註解

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等類同這樣的寫法;

常用方法:

  1. isAnnotationPresent(Class class):是否添加了指定類型的註解;
  2. getAnnotation(Class class): 獲取指定類型的註解;
  3. getAnnotations(): 獲取所有類型的註解;
  4. getParameterAnnotations(): 獲取所有參數的註解;

Java的annotation功能