java 1.5開始引入了註解和反射,正確的來講註解是反射的一部分,沒有反射,註解沒法正常使用,但離開註解,反射依舊可使用,所以來講,php
反射的定義應該包含註解才合理一些。固然,這只是我的想法,至於java官方爲何這麼涇渭分明不得而知,最重要的是如何使用註解。java
註解的功能分爲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.