加了註解,等於打上了某種標記,沒加,則等於沒有某種標記,以後,其他程序可以用反射來了解你的類上面有無何種標記,看你有什麼標記,就去幹相應的事。標記可以加在類,方法,字段,包上,方法的參數上。
(1) Java.lang中最基本的Annotation有 @Deprecated, @Override, @SuppressWarnings三種;其中@Deprecated表示過時或者拋棄不用的element,因爲有更好的可以替代或者是原element的使用存在一定危險;
@Override聲明瞭一個方法打算重寫父類的方法;利用@Override很多時候可以檢測手動重寫的方法是否正確;
@SuppressWarnings指示在註釋元素以及包含在該註釋元素中的所有程序元素中取消顯示指定的編譯器警告。
針對類的註釋,可以用反射Class.isAnnotationPresent(Class<? Extends Annotation> annotationClass)來檢測在某個類上是否存在指定的註釋類;
針對方法的註釋,也可以用反射Class.getMethod. isAnnotationPresent(Class<? Extends Annotation> annotationClass)來檢測指定方法上是否存在指定的註釋類;
(2)Java.lang.annotation中的接口有以下:
Documented:某一類型的註釋被javadoc或者某種類似的工具進行文檔化
Inherited:指示註釋類型被自動繼承
Retention:指示註釋類型將會保留多久;其默認值爲RetentionPolicy.CLASS(編譯器將把註釋記錄在類文件中,但在運行時VM不需要保留註釋。);它還可以取值爲RetentionPolicy.SOURCE(編譯器要丟棄的註釋。)和RetentionPolicy.RUNTIME(編譯器將把註釋記錄在類文件中,在運行時 VM 將保留註釋,因此可以反射性地讀取。)。其中@Override和@SuppressWarnings是RetentionPolicy.SOURCE級別的;@Deprecated是RetentionPolicy.RUNTIME級別的
Target:指示註釋類型適用的程序元素的種類;其ElementType的取值可以是ANNOTATION_TYPE(註釋類型聲明),CONSTRUCTOR(構造器聲明),FIELD(屬性聲明),TYPE等;例如:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
(3)定義自己的MyAnnotation,爲MyAnnotation類增加參數,併爲參數添加默認值:
public String color() default "green";
public int[] array() default {1,2};
public String value() default "java";
public MetaAnnotation annotation() default @MetaAnnotation("miracle");//有個註釋類名爲MetaAnnotation;其參數增加也如上所示;由@MetaAnnotation定義default值的方式可知,在@MetaAnnotation類中需要設置的屬性值爲Value。
如果註解中有一個名稱爲value的屬性,並且其他屬性都採用默認值,且只想設置value屬性,那麼,在使用時可以省略value=,例如:
@MyAnnotation("javaweb")
參數爲註解的情況:@MyAnnotation(value="red",annotation=@MetaAnnotation("samuel"))用反射的方法瞭解User類上是否有註解,什麼註解的方法如下,注意數組Annotation的輸出方式:
if (User.class.isAnnotationPresent(MyAnnotation.class)){
MyAnnotation myAnnotation = User.class.getAnnotation(MyAnnotation.class);
System.out.println(myAnnotation.color());
System.out.println(Arrays.toString(myAnnotation.array()));
System.out.println(myAnnotation.value());
MetaAnnotation ma = myAnnotation.annotation();
System.out.println(ma.value());
}