java 註解
註解的介紹
提到註解,我們會不由的想到註釋,其實註解和註釋不是一個東西,註釋的作用就是解釋代碼,方便理解和閱讀,說白了就是給程序員看的。而註解則不是,註解的作用比較大,可以進行編譯檢查、生成doc文檔或者進行代碼分析。
java語言中的類、方法、變量等都可以被標註。java標註可以通過反射獲取標註內容,在編譯器生成類文件時,標註可以被嵌入到字節碼中。虛擬機可以保存標註內容,在運行時可以獲取到標註內容。
java 預定義中的註解
- @Override:
重寫或者實現父類或者接口中的方法時,會出現這個註解,強制格式檢查 - @Deprecated
標註當前方法已經過時。 - @SuppressWarnings(“all”)
壓制警告
java 中自定義註解
格式
// MyAnnotation1 自定義註解名,注意@
public @interface MyAnnotation1 {}
我們可以通過反編譯看一下如何實現的
這就好像我們定義了一個接口,這個接口繼承了java.lang.annotation.Annotation,既然是接口,我們也可以添加一些屬性,比如說 int 類型的 id,String 類型的 name,除此之外還可以添加數組類型,枚舉類型或者自定義的註解類型(注意有括號)
舉個例子:
public @interface MyAnnotation2 {
//default 默認值
int id() default 1;
String name();
MyAnnotation1 annotation1();
//枚舉類型
TypeEnum status();
//String 類型的數組
String[] hobbies();
}
//枚舉類型TypeEnum
public enum TypeEnum{
A{1, “三殺了”},
B(2, “四殺了,我的五殺,五殺!!”),
C(3, "XXX已被終結,垃圾遊戲,ALT + F4");
private int status;
private String msg;
TypeEnum(int status, String msg) {
this.status = status;
this.msg = msg;
}
//省略getter setter方法
}
定義完成之後,在使用的時候需要注意以下幾點:
- 有屬性的,在使用時應對屬性進行賦值。
- 有默認值的(default)的可以賦值也可以不賦值,不進行賦值操作就是默認值
- 有且只有一個value(無論數據類型是什麼)屬性,或者除了value屬性之外的其他屬性都有默認值,那麼在賦值的時候不需要 ‘屬性 = 值’,直接可以給定數值。
- 一個方法可以有多個註解。
元註解
給予註解的解釋,就是用來約束註解的。
- @Retention
說明這個註解的生命週期到哪,有三個取值
RetentionPolicy.SOURCE : 只在源碼階段保留,不參與代碼的運行和解析,不保留在class文件裏
RetentionPolicy.CLASS : 保留到編譯進行的時候,不會被加載到虛擬機裏
RetentionPolicy.RUNTIME : 可以加載到虛擬機裏,參與代碼執行,在程序運行的時候可以獲取他們 - @Documented
將註解的元素可以包含到javadoc文檔中 - @Target
標記這個註解是那種 java 成員,是方法,是類,還是屬性等
ElementType.TYPE 當前註解可以用於類、接口聲明
ElementType.METHOD 用於方法的聲明位置
ElementType.FIELD 用於成員變量的聲明位置 - @Inherited
標記這個註解是繼承於哪個這注解類,就是說如果一個被@Inherited 修飾註解註解在一個父類上,那麼他的子類也會有這個被@Inherited修飾的註解