Java註解Annotation詳解

註解是一種標記,在程序中加上某種註解就等於爲程序打上了某種標記,在javac編譯器,開發工具和其他程序可以用反射來了解你的類及各種元素上是否存在標記,存在什麼標記,就去幹相應的事標記可以加在包,類,字段,方法,方法的參數以及局部變量上。

自定義註解及其應用

1)、定義一個最簡單的註解

?
1
2
3
public @interface MyAnnotation {
    //......
}

2)、把註解加在某個類上:

?
1
2
3
4
@MyAnnotation
public class AnnotationTest{
    //......
}


註解創建案例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.ljq.test;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
 * 定義一個註解
 
 
 * @author jiqinlin
 *
 */
 //Java中提供了四種元註解,專門負責註解其他的註解,分別如下
 
 //@Retention元註解,表示需要在什麼級別保存該註釋信息(生命週期)。可選的RetentionPoicy參數包括:
 //RetentionPolicy.SOURCE: 停留在java源文件,編譯器被丟掉
 //RetentionPolicy.CLASS:停留在class文件中,但會被VM丟棄(默認)
 //RetentionPolicy.RUNTIME:內存中的字節碼,VM將在運行時也保留註解,因此可以通過反射機制讀取註解的信息
 
 //@Target元註解,默認值爲任何元素,表示該註解用於什麼地方。可用的ElementType參數包括
 //ElementType.CONSTRUCTOR: 構造器聲明
 //ElementType.FIELD: 成員變量、對象、屬性(包括enum實例)
 //ElementType.LOCAL_VARIABLE: 局部變量聲明
 //ElementType.METHOD: 方法聲明
 //ElementType.PACKAGE: 包聲明
 //ElementType.PARAMETER: 參數聲明
 //ElementType.TYPE: 類、接口(包括註解類型)或enum聲明
 
 //@Documented將註解包含在JavaDoc中
 
 //@Inheried允許子類繼承父類中的註解
  
 
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
 public @interface MyAnnotation {
    //爲註解添加屬性
     String color();
    String value() default "我是林計欽"//爲屬性提供默認值
     int[] array() default {123}; 
    Gender gender() default Gender.MAN; //添加一個枚舉
     MetaAnnotation metaAnnotation() default @MetaAnnotation(birthday="我的出身日期爲1988-2-18");
    //添加枚舉屬性
  
}

註解測試類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.ljq.test;
 
 /**
 * 註解測試類
 
 
 * @author jiqinlin
 *
 */
 //調用註解並賦值
 @MyAnnotation(metaAnnotation=@MetaAnnotation(birthday = "我的出身日期爲1988-2-18"),color="red", array={2326})
 public class AnnotationTest {
 
    public static void main(String[] args) {
        //檢查類AnnotationTest是否含有@MyAnnotation註解
         if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){
            //若存在就獲取註解
             MyAnnotation annotation=(MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
            System.out.println(annotation);
            //獲取註解屬性
             System.out.println(annotation.color()); 
            System.out.println(annotation.value());
            //數組
             int[] arrs=annotation.array();
            for(int arr:arrs){
                System.out.println(arr);
            }
            //枚舉
             Gender gender=annotation.gender();
            System.out.println("性別爲:"+gender);
            //獲取註解屬性
             MetaAnnotation meta=annotation.metaAnnotation();
            System.out.println(meta.birthday());
        }
    }
}

枚舉類Gender,模擬註解中添加枚舉屬性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.ljq.test;
 /**
 * 枚舉,模擬註解中添加枚舉屬性
 
 * @author jiqinlin
 *
 */
 public enum Gender {
    MAN{
        public String getName(){return "男";}
    },
    WOMEN{
        public String getName(){return "女";}
    }; //記得有“;”
     public abstract String getName();
}

註解類MetaAnnotation,模擬註解中添加註解屬性

?
1
2
3
4
5
6
7
8
9
10
11
package com.ljq.test;
 
 /**
 * 定義一個註解,模擬註解中添加註解屬性
 
 * @author jiqinlin
 *
 */
 public @interface MetaAnnotation {
    String birthday();
}

推薦觀看:

深入理解Java:註解(Annotation)自定義註解入門:

http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

xUtils註解機制 

http://blog.csdn.net/rain_butterfly/article/details/37931031

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章