注解类 package test; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.ElementType; import java.lang.annotation.Target; /** * * @author T-Bag.& * */ @Retention(RetentionPolicy.RUNTIME) // 在运行时保持,也就是说这个注解在运行时是有效的,那么才可以用反射去解析这个注解,可选的有CLASS和SOURCE @Target(value = ElementType.METHOD) // 标志MyAnnotation只能被方法使用,比如如果类想加这个注解就会报错,可选的有FIELD、CONSTRUCTOR等等 @Documented // 有了这个注解,则使用MyAnnotation注解的方法或者类在产生JAVA DOC时候,就会在DOC中显示 public @interface MyAnnotation { /** * 一个Annotation中只可以有基本数据类型、String、Class、Annotation、Enum以及这些类型的一维数组类型 */ String value1() default "hello";// 定义String类型的value1,默认是hello String[] value2() default "hello world";// 定义String一维数组类型的value2,默认是hello Class<MyAnnotationTest> c();// 定义class类型 ENUM e() default ENUM.ONE;// 定义枚举类型 ENUM[] e2() default { ENUM.ONE, ENUM.TWO }; int value3() default 5;// 基本数据类型中的整形 }; enum ENUM { ONE, TWO }; 使用类 package test; import java.lang.annotation.Annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Method; /** * * @author T-Bag.& * */ public class MyAnnotationTest { /** * 一个方法可以使用多个的注解 */ @MyAnnotation(c = MyAnnotationTest.class) // 使用我们的注解,因为我们有些都有默认数值,只有c没有,所以需要显示复制 @Deprecated // 使用JDK已有的 @SuppressWarnings("unchecked") // 这个注解的Retention是RetentionPolicy.CLASS,也就是说,他在运行时是不能解析的 // 这也是后面遍历输出为什么没有@SuppressWarnings的原因 public void method() { System.out.println("invoke method"); } public static void main(String[] args) throws SecurityException, NoSuchMethodException { // AnnotatedElement是AccessibleObject, Class, Constructor, Field, Method, // Package这些类的父类 // 他的作用就是标志这些元素是可以被注解的,并且提供了获取注解的接口方法 // 下面我们对method这个方法进行反射分析 Class<MyAnnotationTest> c = MyAnnotationTest.class; Method method = c.getMethod("method", new Class[] {});// 返回无参的method if (method.isAnnotationPresent(MyAnnotation.class)) {// 判断这个方法是否有MyAnnotation的注解 Annotation annotation = method.getAnnotation(MyAnnotation.class);// 有的话获取这个注解 MyAnnotation m = (MyAnnotation) annotation; String value1 = m.value1();// 获取属性值 System.out.println(value1); } for (Annotation a : method.getAnnotations()) {// 遍历整个方法有的注解,查看类型 System.out.println(a.annotationType()); /** * 输出结果是 hello interface * test.MyAnnotation interface * java.lang.Deprecated * 没有输出SuppressWarnings,原因是SuppressWarnings注解是CLASS保持的,@Retention(RetentionPolicy.CLASS) * 这在运行时是不能捕获的 */ } } }