1. 程式人生 > >關於註解Annotation第二篇

關於註解Annotation第二篇

ace public not turn http 通過反射 cnblogs interface 這樣的

舉個例子來看一看註解定義類在語法樹中用哪些語法節點來表示以及如何組織的。

@Retention(RetentionPolicy.RUNTIME) // 註解會在class中存在,運行時可通過反射獲取
@Target(ElementType.METHOD)         // 目標是方法
@Documented   // 文檔生成時,該註解將被包含在javadoc中,可去掉
public @interface TestAnnotation {
	public String name() default "helloworld";
}

查看JCClassDecl語法節點(註解類也被當作一個類來表示)的jcModifiers屬性,截圖如下。

技術分享

jcModifiers中的flags屬性值為8705,必寫為這樣的表示:

(1<<13)|(1<<0)|(1<<9)

查看Flags中關於各個Modifiers指定的常量,可知是public和interface且還有個專門表示annotation的靜態常量,如下:

/** Flag that marks attribute interfaces 標記屬性接口, added in classfile v49.0.
     *  應該只能修飾註解定義類
     */
    public static final int ANNOTATION   = 1<<13;

然後看一下JCMethodDecl屬性,截圖如下:

技術分享

使用如上的註解,如下:

public class C {
	
	@TestAnnotation(name = "小明")
	public Integer test(int a, String name, Object c) {
		return 1;
	}	
}

截圖如下:

技術分享

關於註解Annotation第二篇