天天看點

注解(Annotation)功能的學習筆記1.注解的概述2.注解的分類3.注解的文法4.注解的使用5.通路注解的資訊

1.注解的概述

java從JDK1.5開始增加了Annotation(注解)的功能,可以對類、構造方法、成員變量、方法、參數等進行聲明;不會影響程式的運作,在程式運作的時候還可以通過反射讀取這些資訊;

2.注解的分類

按照運作機制分成3類 1.源碼注解     注解隻在源代碼中存在,編譯成class的時候就不存在了 2.編譯時注解  注解在源碼和class檔案中都存在 3.運作時注解  在運作階段才會起作用,甚至會影響運作邏輯

3.注解的文法

注解(Annotation)功能的學習筆記1.注解的概述2.注解的分類3.注解的文法4.注解的使用5.通路注解的資訊

注解的成員類型是受限制的,合法的類型包括基本資料類型以及String、Class、Annotation、Enumeration; 如果注解隻有一個成員,則成員名必須取名為value(),在使用時可以忽略成員名和指派号(=) 注解類可以沒有成員,沒有成員的注解稱為辨別注解

注解(Annotation)功能的學習筆記1.注解的概述2.注解的分類3.注解的文法4.注解的使用5.通路注解的資訊

@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());

			}

		}
           

上面隻是擷取了一個字段上的注解,在其他地方聲明的注解操作方法相似;