Java註解Annotation詳解

註解至關於一種標記,在程序中加了註解就等於爲程序打上了某種標記,沒加,則等於沒有某種標記,之後,javac編譯器,開發工具和其餘程序能夠用反射來了解你的類及各類元素上有無何種標記,看你有什麼標記,就去幹相應的事標記能夠加在包,類,字段,方法,方法的參數以及局部變量上。java

自定義註解及其應用數組

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

public @interface MyAnnotation {開發工具

    //......測試

}spa

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

@MyAnnotationcode

public class AnnotationTest{對象

    //......繼承

}

如下爲模擬案例

自定義註解@MyAnnotation

複製代碼

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

複製代碼

註解測試類AnnotationTest

複製代碼

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

複製代碼

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

複製代碼

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

複製代碼

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

複製代碼

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

複製代碼

相關文章
相關標籤/搜索