java 註解的基本原理和編程實現

java 1.5開始引入了註解和反射,正確的來講註解是反射的一部分,沒有反射,註解沒法正常使用,但離開註解,反射依舊可使用,所以來講,php

反射的定義應該包含註解才合理一些。固然,這只是我的想法,至於java官方爲何這麼涇渭分明不得而知,最重要的是如何使用註解。java


註解的功能分爲2部分:數組

  1. 做爲特定的標記編輯器

  2. 額外信息的載體函數


>>>>定義一個UserAnnotation註解類spa

@Target(value = { ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAnnotation {
	public int id() default 0;
	public String name() default "";
	public int age() default 18;
	public String gender() default "M";
}

其中@target個@Retention自己就是註解插件

【@target】這個註解來指定給哪一類java成員註解,指定註解目標該是什麼樣的東西code

註解@Target的源碼對象

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE) //這不是在做弊,這確實是本身註解本身,因此說註解也能夠被字節給註解
public @interface Target {
    ElementType[] value(); //值可使數組 value={...}
}

public enum ElementType {
    TYPE,  //給類(型)註解
    FIELD, //給字段註解,不要忘了,字段能夠是對象
    METHOD, //給方法註解
    PARAMETER, //給參數註解
    CONSTRUCTOR, //給構造方法註解
    LOCAL_VARIABLE, //給局部變量註解
    ANNOTATION_TYPE,//給註解註解(這貌似把本身不當類來看)
    PACKAGE, //給包註解
    TYPE_PARAMETER, //不知道,等知道了我再寫在這裏
    TYPE_USE //這個也不知道
}

【@Retention】表示註解運行的狀態,換句話說,註解改在什麼樣的狀態下才能運行接口

註解@Retention的源碼

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}

public enum RetentionPolicy {
    SOURCE, //源碼狀態運行,
    CLASS, //編譯類文件時運行
    RUNTIME //運行時運行
}

通常來講,源碼狀態運行和編譯狀態運行的註解每每和編譯器相關,好比報錯,警告,類編譯參數等,這2類狀態通常和編輯器插件關係密切,這裏再也不討論

在平常開發中RUNTIME用的最多,這是開發人員能夠控制的一個狀態。


【@Documented】額,很少解釋,具體來講是生成說明文檔時把類的解釋添加進去


關於註解的方法說明,註解只有方法,沒有字段,由於註解也是一個interface,只不過前面加了一個@符號,還有一點是這些方法沒法實現,寫法和C++的純虛函數類似

請看id()方法的解釋

 public int id() default 0; 
/*首先,方法必須是public的,去掉public,默認也是public,接口interface不也是這樣麼
 *
 *其次,default默認值不是必須的,方法必須有返回值,返回值能夠是java中複雜對象,也能夠是基本類型,枚舉都行
 *如 ElementType[] value();
 */


註解定義好了,怎麼使用呢,以下

public class TestMain
{
  @UserAnnotation(age=20,gender="F",id=2014,name="zhangsan")//註解的使用
  private Object obj;
  
  public static void main(String[] args) throws Exception
  {
     Filed objField = TestMain.class.getField("obj");
     UserAnnotation ua = objField.getAnnotation(UserAnnotation.class);//獲得註解,起到了標記的做用
     
    System.out.println(ua.age()+","+ua.gender()+","+ua.id()+","+ua.name());
    //***進一步操做的話,假設Object要指向一個User類,那麼能夠講註解的值給他
    TestMain tm = new TestMain();
    objFiled.set(tm,new User(ua.age(),ua.gender(),ua.id(),ua.name())); //不錯吧,將本身的信息送給obj,起到了附加信息的做用
    
    //-----------請自由遐想吧~~,下面來講說註解怎麼能得到註解本身的註解-------------
   Target t = ua.annotationType().getAnnotation(Target.class)
   ElementType[] values = t.value();
   //~~~~~~~~~~~~~~完了,再一次自由遐想吧~~~~~~~~~~~~~~
   
   Sysout.out.println("注意:是遐想,不是瞎想!!");
  }
}


try doing it.

相關文章
相關標籤/搜索