package com.wangbiao.test; import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Method; /** * Annotation * @author WangBiao *2013-4-28下午05:32:38 */ public class Test_Annotation { // @Retention:註解的保留位置 // @Retention(RetentionPolicy.SOURCE) //註解僅存在於源碼中,在class字節碼文件中不包含 // @Retention(RetentionPolicy.CLASS) // // 默認的保留策略,註解會在class字節碼文件中存在,但運行時沒法得到, // @Retention(RetentionPolicy.RUNTIME) // // 註解會在class字節碼文件中存在,在運行時能夠經過反射獲取到 // // @Target:註解的做用目標 // // @Target(ElementType.TYPE) //接口、類、枚舉、註解 // @Target(ElementType.FIELD) //字段、枚舉的常量 // @Target(ElementType.METHOD) //方法 // @Target(ElementType.PARAMETER) //方法參數 // @Target(ElementType.CONSTRUCTOR) //構造函數 // @Target(ElementType.LOCAL_VARIABLE)//局部變量 // @Target(ElementType.ANNOTATION_TYPE)//註解 // @Target(ElementType.PACKAGE) ///包 // // @Document:說明該註解將被包含在javadoc中 // // @Inherited:說明子類能夠繼承父類中的該註解 public static void getAnnotationContent() throws Exception{ Class c=Class.forName("com.wangbiao.test.A"); Method m=c.getMethod("getName"); if(m.isAnnotationPresent(MyAnnotation_third.class)){ MyAnnotation_third an=m.getAnnotation(MyAnnotation_third.class); String name=an.name(); int age=an.age(); System.out.println(name+"-"+age); } } @SuppressWarnings({"unchecked","deprecation"}) public static void main(String[] args) throws Exception { A a=new A(); a.setName("test"); System.out.println(a.getName()); // Class c=Class.forName("com.wangbiao.test.A"); // Method m=c.getMethod("getName"); // Annotation[] as=m.getAnnotations(); // for (Annotation annotation : as) { // System.out.println(annotation); // } getAnnotationContent(); } } @Deprecated @MyAnnotation_first(value={"test","good"}) @MyAnnotation_second(name="test") @MyAnnotation_third(name="test",age=20) class A<T>{ private T name; @Deprecated @MyAnnotation_first(value={"test","good"}) @MyAnnotation_second(name="test") @MyAnnotation_third(name="test",age=20) public T getName() { return name; } public void setName(T name) { this.name = name; } } //註解的保存範圍 @Retention(value=RetentionPolicy.RUNTIME) @interface MyAnnotation_first{ public String[] value(); } @interface MyAnnotation_second{ public String name();//必須加一個括號 } //若是Retention不是RetentionPolicy.RUNTIME,則取不到這個annotation @Retention(value=RetentionPolicy.RUNTIME) //@Target(value=ElementType.TYPE)//定義註解的位置 @interface MyAnnotation_third{ public String name() default "zhangsan";//必須加一個括號 public int age() default 20; }