1、自定義註釋 一、自定義Annotation的格式 [public] @interface Annotation名稱{ 數據類型 變量名稱 (); } 提示:使用@interface就至關於繼承了Annotation接口。 示例一:在Annotation中設置多個屬性 public @interface AnnotationWithParam { public String key(); public String value(); } 示例二:在Annotation中設置數組屬性 public @interface AnnotationWithArrayParam { public String[] value(); // 接收設置的內容是一個字符串數組 } 二、Annotation定義變量的默認值 [public] @interface Annotation名稱{ 數據類型 變量名稱 () default 默認值; } example: public @interface AnnotationWithParam { public String key() defalut "zhangsan"; public String value() defalut "張三"; } 三、使用枚舉限制設置的內容 /***定義枚舉類***************/ public enum Name { ZSM,LX,LIU } /*****自定義Annotation類****/ public @interface AnnotationEnum { public Name name() default Name.ZSM; } 提示:這樣定義的Annotation,在使用AnnotationEnum時,全部的取值就必須從Name這個枚舉中取得。 2、相關內建註釋知識介紹 1) @Retention:用於定義一個Annotation的保存範圍。在Retention定義中存在一個RetentionPolicy的變量,此變量用於指定Annotation的保存範圍。RetentionPolicy包含以下3個範圍: (1) SOURCE: 此Annotation類型的信息只會保留在程序源文件中(*.java),編譯以後不會保存在編譯好的類文件(*.class)中; (2) CLASS: 默認範圍。此Annotation類型的信息只會保留在程序源文件中(*.java)和編譯以後 的 類文件(*.class)中。在使用此類時,這些Annotation信息將不會被夾在到虛擬機(JVM)中; (3) runtime: 此Annotation類型的信息保留在源文件(*.java)、類文件(*.class)中,在執行時也會加載到JVM中。 2) @Target: 用於指定註釋出現的位置(類、方法或屬性)。在Target定義存在ElememtType[]枚舉類型的變量,這個變量主要指定Annotation的使用限制。 public enum ElementType { TYPE, // 只能用在類、接口、枚舉類型上 FIELD, METHOD, PARAMETER, // 只能用在參數的聲明上 CONSTRUCTOR, // 只能用在構造器的聲明上 LOCAL_VARIABLE,// 只能用在局部變量的聲明上 ANNOTATION_TYPE,// 只能用在註釋的聲明上 PACKAGE } 3) @Inherit:用於標註一個父類的註釋是否能夠被之類所繼承,若是一個Annotation須要被其之類所繼承,則在聲明時直接使用@Inherit註釋便可。 3、經過反射取得Annotation 若是想讓一個Annotation其做用,則必須結合反射機制。Class類中存在如下幾種與Annotation操做有關的方法: public <A extends Annotation> A getAnnotation(Class<A> annotationClass) 若是在一個元素中存在註釋,則取得所有註釋 public Annotation[] getAnnotations() 返回此元素上的全部註釋 public Annotation[] getDeclaredAnnotations() 返回直接存放在此元素上的全部註釋 public boolean isAnnotation() 判斷元素是否表示一個註釋 public boolean isAnnotionPresent(Class<? extends Annotation> annotationClass) 判斷一個元素上是否存在註釋 示例(annotation繼承): @Inherited @Retention(value=RetentionPolicy.RUNTIME) public @interface MyAnnotation { public String name(); } @MyAnnotation(name="zsm") public class Person {} public class Student extends Person{} @SuppressWarnings({"unchecked","rawtypes"}) public class AnnotationInheritTest { public static void main(String[] args) throws ClassNotFoundException { Class clazz = Class.forName("org.zsm.annnotation.Student"); Annotation[] annotations = clazz.getAnnotations(); // 獲取全部的Annotations for(Annotation annotation : annotations){ System.out.println(annotation); } if(clazz.isAnnotationPresent(MyAnnotation.class)){ MyAnnotation myAnnotation = (MyAnnotation) clazz.getAnnotation(MyAnnotation.class); System.out.println(myAnnotation.name()); } } }