1.注解的概述
java從JDK1.5開始增加了Annotation(注解)的功能,可以對類、構造方法、成員變量、方法、參數等進行聲明;不會影響程式的運作,在程式運作的時候還可以通過反射讀取這些資訊;
2.注解的分類
按照運作機制分成3類 1.源碼注解 注解隻在源代碼中存在,編譯成class的時候就不存在了 2.編譯時注解 注解在源碼和class檔案中都存在 3.運作時注解 在運作階段才會起作用,甚至會影響運作邏輯
3.注解的文法
注解的成員類型是受限制的,合法的類型包括基本資料類型以及String、Class、Annotation、Enumeration; 如果注解隻有一個成員,則成員名必須取名為value(),在使用時可以忽略成員名和指派号(=) 注解類可以沒有成員,沒有成員的注解稱為辨別注解
@target 可以指定這個注解在什麼地方使用 ,可以指定一下幾個枚舉類型的對象 ElementType.CONSTRUCTOR 在構造方法上聲明使用 ElementType.FIELD 在字段上聲明使用 ElementType.LOCAL_VARIABLE 在局部變量上使用 ElementType.METHOD 在方法上使用 ElementType.PACKAGE 在包上使用 ElementType.PARAMETER 在參數上使用 ElementType.TYPE 在類.接口上使用 @Rentention 可以設定注解的有效範圍 RetentionPolicy.RUNTIME 在運作的時候加載到虛拟機中有效範圍最大 RetentionPolicy.CLASS 編譯注解到類檔案中,但是在運作時不加載Annotation到虛拟機中 RententionPolicy.SOURCE 表示不編譯注解到類檔案中,有效範圍最小 @Inherited 标示性的元注解,表示允許子類繼承 @Documented 生成javadoc會包含注解資訊
4.注解的使用
比如下面這個注解代碼
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Descriptor {
String desc();
String author();
int age() default 18;
}
使用如下
public class User {
@Descriptor(desc = "I am a cool boy", author = "liverpool", age = 10)
private int id;
@Descriptor(desc = "I am a cool boy", author = "liverpool", age = 10)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
5.通路注解的資訊
在定義Annotation類型時将@Retention設定為RetentionPolicy.RUNTIME,那麼運作時通過反射可以擷取相關的Annotation資訊;
反射類中Constructor Field 和Method均繼承了AccessiableObject類, 在Accessiable中定義了3個關于Annotation的方法, isAnnotationPresent(Class<?extends Annotation> annotationClass) 判斷是否添加了指定類型的注解 getAnnotation(Class<T> cls) 用來擷取指定類型的注解(Annotation) getAnnotations()用來擷取所有類型的注解 下面我們來擷取上面的代碼中的注解資訊
User user = new User();
Class<User> mUserClass = (Class<User>) user.getClass();
// 通過反射擷取字段
Field field = mUserClass.getDeclaredField("id");
// 判斷這個字段上面是否添加了Descriptor類型的注解
boolean f = field.isAnnotationPresent(Descriptor.class);
if (f) {
// 擷取一個Descriptor類型的注解對象
Descriptor s = field.getAnnotation(Descriptor.class);
System.out.println(s.age());
System.out.println(s.author());
System.out.println(s.desc());
// 擷取這個對象上面所有注解的數組
Annotation[] as = field.getAnnotations();
System.out.println(as.length);
for (int i = 0; i < as.length; i++) {
Descriptor ss = (Descriptor) as[i];
System.out.println(ss.age());
System.out.println(ss.author());
System.out.println(ss.desc());
}
}
上面隻是擷取了一個字段上的注解,在其他地方聲明的注解操作方法相似;