java中註解的原理和實現機制
java中註解的實現原理和機制
一.什麼是註解:
註解是標記,也可以理解成是一種應用在類、方法、引數、屬性、構造器上的特殊修飾符。註解作用有以下三種:
第一種:生成文件,常用的有@[email protected]
第二種:替代配置檔案的作用,尤其是在spring等一些框架中,使用註解可以大量的減少配置檔案的數量。
第三種:檢查程式碼的格式,如@Override,標識某一個方法是否覆蓋了它的父類的方法。
二.註解的底層實現原理:
註解的底層也是使用反射實現的,我們可以自定義一個註解來體會下。註解和介面有點類似,不過申明註解類需要加上@interface,註解類裡面,只支援基本型別、String及列舉型別,裡面所有屬性被定義成方法,並允許提供預設值。
java 5.0開始,在java.lang.annotations中提供了四種元註解,專門註解其他的註解:
@Target? — —註解用於什麼地方
TYPE, //給類(型)註解
FIELD, //給欄位註解,不要忘了,欄位可以是物件
METHOD, //給方法註解
PARAMETER, //給引數註解
CONSTRUCTOR, //給構造方法註解
LOCAL_VARIABLE, //給區域性變數註解
ANNOTATION_TYPE,//給註解註解(這貌似把自己不當類來看)
PACKAGE, //給包註解
@Retention — —註解執行狀態
SOURCE, //原始碼狀態執行,
CLASS, //編譯類檔案時執行
RUNTIME //執行時執行
@Documented — — 生成說明文件,新增類的解釋
@Inherited — —允許子類繼承父類中的註解。
我們自定義一個註解來感受下:
定義註解類:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface User {
String name() default "張三";
}
由於我們的註解是類註解,所以我們建立一個類
@User
public class test {
}
到了這裡,註解可能還沒起什麼作用。我們需要通過反向代理去讀取類中定義的註解,讀出來使用就簡單了。
建立測試類,來讀取:
public class testamin {
public static void main(String[] args) throws ClassNotFoundException{
Class<?> classTest=Class.forName("com.test.test");
Annotation[] ann=classTest.getAnnotations();
for(Annotation aa:ann){
User u=(User)aa;
System.out.println(u.name());
}
}
}
控制檯輸出了我們定義的註解,註解的初識就介紹到這裡吧。