1,註解概念
Java註解是附加在代碼中的一些元信息,用於一些工具在編譯、運行時進行解析和使用,起到說明、配置的功能。
註解不會也不能影響代碼的實際邏輯,僅僅起到輔助性的作用。包含在 java.lang.annotation 包中。
其中涉及到另外一個概念“元註解”,元註解是指註解的註解。包括 @Retention @Target @Document @Inherited @Repeatable 五種。
@Retention
當 @Retention 應用到一個註解上的時候,它解釋說明了這個註解的的存活時間。
- RetentionPolicy.SOURCE 註解只在源碼階段保留,在編譯器進行編譯時它將被丟棄忽視。
- RetentionPolicy.CLASS 註解只被保留到編譯進行的時候,它並不會被加載到 JVM 中。
- RetentionPolicy.RUNTIME 註解可以保留到程序運行的時候,它會被加載進入到 JVM 中,所以在程序運行時可以獲取到它們。
@Documented
它的作用是能夠將註解中的元素包含到 Javadoc 中去。
@Target
@Target 指定了註解運用的地方。
ElementType.ANNOTATION_TYPE 可以給一個註解進行註解
ElementType.CONSTRUCTOR 可以給構造方法進行註解
ElementType.FIELD 可以給屬性進行註解
ElementType.LOCAL_VARIABLE 可以給局部變量進行註解
ElementType.METHOD 可以給方法進行註解
ElementType.PACKAGE 可以給一個包進行註解
ElementType.PARAMETER 可以給一個方法內的參數進行註解
ElementType.TYPE 可以給一個類型進行註解,比如類、接口、枚舉
@Inherited
如果一個超類被 @Inherited 註解過的註解進行註解的話,那麼如果它的子類沒有被任何註解應用的話,那麼這個子類就繼承了超類的註解。
@Repeatable
@Repeatable 是 Java 1.8 才加進來的,所以算是一個新的特性,其實只是語法糖而已。
2,自定義註解
註解通過 @interface 關鍵字進行定義。
public @interface PersonAnnotation {
}
註解的屬性
註解的屬性也叫做成員變量。註解只有成員變量,沒有方法。註解的成員變量在註解的定義中以“無形參的方法”形式來聲明,其方法名定義了該成員變量的名字,其返回值定義了該成員變量的類型。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonAnnotation {
int age();
String name();
}
上面代碼定義了 PersonAnnotation 這個註解中擁有 age 和 name 兩個屬性。在使用的時候,我們應該給它們進行賦值。賦值的方式是在註解的括號內以 value=”” 形式,多個屬性之前用 ,隔開。
@PersonAnnotation(age=3,name="Xiaoming")
public class People {
}
參數成員只能用基本類 byte,short,char,int,long,float,double,boolean 八種基本數據類型和 String、Enum、Class、annotations 等數據類型,以及這一些類型的數組.
註解中屬性可以有默認值,默認值需要用 default 關鍵值指定。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonAnnotation {
int age() default 20;
String name() default "Xiaoming";
}
則可以直接使用,不需要進行復制。
@PersonAnnotation
public class People {
}
註解獲取
要獲取類方法和字段的註解信息,必須通過 Java 的反射技術來獲取 Annotation 對象,因爲你除此之外沒有別的獲取註解對象的方法
isAnnotationPresent()
通過 Class 對象的 isAnnotationPresent() 方法判斷它是否應用了某個註解。
getAnnotation()
通過 getAnnotation() 方法來獲取 Annotation 對象。
屬性值獲取
通過以上兩個註解方法就可以獲取註解的值了,接下來我們通過一個自定義的實例來了解註解以上知識點。
import java.lang.annotation.*;
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonAnnotaion {
int age() default 20;
String name() default "Xiaoming";
}
首先定義一個 PersonAnnotaion 註解,接着寫一個 Person 類進行使用該註解。
@PersonAnnotaion(age = 22, name = "LiLei")
public class Person {
}
最後寫個測試類用於獲取該註解的屬性值。
public class PersonAnnataionTest {
public static void main(String[] args) {
boolean hasAnnotation = Person.class.isAnnotationPresent(PersonAnnotaion.class);
if (hasAnnotation) {
PersonAnnotaion testAnnotation = Person.class.getAnnotation(PersonAnnotaion.class);
System.out.println("age :" + testAnnotation.age());
System.out.println("name :" + testAnnotation.name());
}
}
}
打印結果如下:
以上是類的註解,同樣的,屬性、方法都可以使用註解,最常見的就是 Java 提供了一些內置的註解。
- @Deprecated 這個元素是用來標記過時的元素,編譯器在編譯階段遇到這個註解時會發出提醒警告,告訴開發者正在調用一個過時的元素比如過時的方法、過時的類、過時的成員變量。
- @Override 提示子類要複寫父類中被 @Override 修飾的方法
- @SuppressWarnings 阻止警告的意思。之前說過調用被 @Deprecated 註解的方法後,編譯器會警告提醒,而有時候開發者會忽略這種警告,他們可以在調用的地方通過 @SuppressWarnings 達到目的。
自定義註解類規則
- Annotation型定義爲@interface, 所有的Annotation會自動繼承java.lang.Annotation這一接口,並且不能再去繼承別的類或是接口.
- 參數成員只能用public或默認(default)這兩個訪問權修飾
- 參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和String、Enum、Class、annotations等數據類型,以及這一些類型的數組.
- 要獲取類方法和字段的註解信息,必須通過Java的反射技術來獲取 Annotation對象,因爲你除此之外沒有別的獲取註解對象的方法
- 註解也可以沒有定義成員, 不過這樣註解就沒啥用了
以上便是註解的一些基礎知識點。
參考鏈接
1、http://blog.csdn.net/briblue/article/details/73824058
2、https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html