學(xué)習(xí)書籍
java SE5中引入的新特性之一掂骏,并在
java.lang
中內(nèi)置了幾種注解:
- @Override 表示重寫父類方法
- @Deprecated 表示方法過期
- @SuppressWarnings 關(guān)閉不當(dāng)?shù)木幾g器警號信息
基本語法
定義注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Hi {
int id();
}
注解的定義與java接口的定義很像,最終也會編譯成class文件
元注解
- @Target
表示注解可以使用的地方煮嫌」酰可能的
ElementType
參數(shù)包括:
- CONSTRUCTOR: 構(gòu)造器聲明
- FIELD:屬性聲明
- LOCAL_VARIABLE:局部變量聲明
- METHOD: 方法聲明
- PARAMETER:參數(shù)聲明
- PACKAGE:包聲明
- TYPE:類称开、接口或enum聲明
- ANNOTATION_TYPE: 注解聲明
- @Retention
表示在什么級別保存該注解信息八毯∑せ瘢可選的
RetentionPolicy
參數(shù)包括:
- SOURCE: 源碼級別焙蚓,將被編譯器丟棄
- CLASS: 注解在class文件中可用,但會被VM丟棄洒宝,此為默認(rèn)級別
- RUNTIME: VM運行期也保留购公,因此可通過反射機制讀取注解的信息
- @Documented
將此注解包含在Javadoc中
- @Inherited
允許子類繼承父類中的注解
編寫注解處理器
# 使用注解
public class HiEntity {
@Hi(id=22)
public void tetst() {
}
}
# 注解處理器
public class HiChecker {
public static void checker(Class<?> cl) {
for (Method m: cl.getDeclaredMethods()) {
Hi hi = m.getAnnotation(Hi.class);
if (hi != null) {
System.out.println(hi.id());
}
}
}
public static void main(String[] args) {
checker(HiEntity.class);
}
注解元素
注解元素(屬性)可用的類型如下:
- 所有基本類型(int、float雁歌、boolean等)
- String
- Class
- enum
- Annotation
- 以上類型的數(shù)組
如果使用其它類宏浩,編譯會報錯,也不能使用包裝類型
默認(rèn)值
注解的元素必須要具有值靠瞎,要么元素必須有默認(rèn)值比庄,要么使用注解時必須指定值
非基本類型的元素,不可指定為null值乏盐,可自定義一些特殊的值佳窑,如空字符串或負(fù)數(shù)
屬性名為value
時,使用注解指定value
值時可省略父能,如@XX('aa')
等價@XX(value='aa')
,指定多個屬性時神凑,都不能省略變量名