概述
從java1.5以後,jdk提供了註解開發,開發者可以自定義註解。
Annotation並不影響代碼的語義,但是它工作的方式被看做類似程序工具或者類庫,它反過來對正在運行的程序語義有所影響,annotation可以從源文件、class文件、或者在運行時反射的多種方式被調用。
AnnotatedElement接口
所有的域(類,方法,屬性,包等)都實現了這個接口,接口中定義了獲得註解的方法
常見的標識性註解
Override:表示是重寫的方法
Deprecated:過期的方法,不建議使用的
SuppressWarning消除警告
自定義註解
public @interface MyAnn {
//定義註解的屬性,必須要加上()
String value();
}
自定義註解,當註解的屬性名是value時,在對其賦值時可以不指定屬性的名字,否則必須指定屬性名。
需要注意的是這種註解只有在反射調用方法和類的是否纔有意義
@Retention
Java.lang.annotation.Retention可以在定義的Annotation中指定編譯程序如何對待自定義的Annotation,主要是修飾在註解上。
因爲默認是SOURCE,如果要使用自定義註解,一定要設置成RUNTIME
@Retention的使用
@Target
主要標註在註解上,表示被標註的註解可以標註在哪些域上。
public enum ElementType {
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE,
ANNOTATION_TYPE,
PACKAGE
}
@Target的使用
通過反射來獲得註解
public static void main(String[] args) throws Exception {
//獲得指定類的對象
Class clazz = AnnTest1.class;
//獲得指定類的方法
Method method = clazz.getDeclaredMethod("save", new Class[]{});
//判斷某個類上是否存在指定的註解
if(method.isAnnotationPresent(Anndemo.class)){
//獲得指定的註解
Anndemo annotation = method.getAnnotation(Anndemo.class);
//獲得指定註解的內容
String[] values = annotation.value();
for(String val : values){
System.out.println(val);
}
}
//獲得指定方法上的所有註解
Annotation[] declaredAnnotations = method.getDeclaredAnnotations();
for(Annotation ann : declaredAnnotations){
System.out.println(ann.toString());
}
}