Java基礎-Java註解

註解的基本概念

    註解爲我們在代碼中添加信息提供了一種形式化的方法,使我們可以在稍後某個時刻非常方便地使用這些數據。


定義註解的方式

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{

}

如上面代碼中看到的,一個簡單的自定義註解就這樣誕生了。有的同學可能會奇怪,爲什麼需要有@Target,@Retention這兩個註解來修飾我們自定義的註解@Test呢?原來當我們在定義註解時,需要用元註解來對我們的註解進行一定的說明。@Target用來定義你的註解將應用於什麼地方(例如是一個方法或者一個域)。@Retention用來定義該註解在哪一個級別可用,在源代碼中(SOURCE),在類文件中(ClASS)或者在運行時(RUNTIME)。


元註解

上面我們在自定義註解時,發現我們需要元註解來幫忙,那元註解到底有哪些呢?他們分別起的作用有事什麼呢?讓我們來一起看一下。

元註解 說明
@Target 表示該註解可以用於什麼地方。可能的ElementType參數包括:CONSTRUCTOR:構造器的聲明。 FIELD:域聲明(包括enum實例)。LOCAL_VARIABLE:局部變量聲明。METHOD:方法聲明。PACKAGE:包聲明。PARAMETER:參數聲明。TYPE:類,接口(包括註解類)或enum聲明。
@Retention 表示需要在什麼級別保存該註解信息。可選的RetentionPolicy參數包括:SOURCE:註解將被編譯器丟棄。CLASS:註解在class文件中可用,但會被VM丟棄。RUNTIME:VM將在運行期也保留註解,因此可以通過反射機制讀取註解的信息。
@Documented 將此註解包含在javadoc中。
@Inherited 允許子類繼承父類中的註解。

註解元素

在註解中我們是可以自定義元素的。但是是不是所有的類型都可以作爲註解的元素呢?下面我們一起來看一下Java中對註解元素的規定。
1. 所有基本類型(int,float,boolean,double,long等)
2. String
3. Class
4. enum
5. Annotation
6. 以上類型的數組

這裏需要強調一下的是:不允許使用任何包裝類型


默認值限制

在給我們自己定義的註解添加註解元素的時候,我們是可以給這些註解元素添加默認值的,這裏對默認值有有一些要求,主要是一下兩點:
1. 元素不能有不確定的值。也就是說,元素必須要麼具有默認值,要麼在使用註解時提供元素的值。
2. 對於非基本類型的元素,無論在源代碼中聲明時,或是在註解接口中定義默認值時,都不能以null爲其值。


動手試一試

寫了這麼多概念性的東西,感覺是時候動手寫一下了。
首先我們自定義一個註解,

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationTest{
public String name() default "";
public int code() default 0;
public Class clazz() Object.class;
}

然後我們定義一個實體類

public class AnnotationModel{

     @AnnotationTest(name="時間",code=1,clazz=Date.class)
     public Date startDate;

     public Date getStartDate(){
          return startDate;
     }

     public void setStartDate(Date date) {
           this.startDate = date;
     }
}

最後,我們通過反射的方法獲取到定義到FIELD中的註解信息。

public class AnnotationMain{
      public static void main(String[] args) {
           Class<?> modelClazz = AnnotationModel.class;
           Field[] fields = modelClazz.getDeclaredFields();
           for(Field field : fields) {
                 // 獲取指定的註解
                 AnnotationTest annotationTest = field.getAnnotation(AnnotationTest.class);
                 if(null == annotationTest) {
                      continue;
                 }
                 System.out.println(annotationTest.name);
                 System.out.println(annotationTest.code);
                 System.out.println(annotationTest.clazz);
           }           
      } 
}

寫到這裏就差不多了,後面還有嵌套註解,感興趣的同學可以自己嘗試一下。

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