三、自定义注释@interface
@Retention(RetentionPolicy.RUNTIME) public @interface LogClass { String type() default ""; String comments() default ""; }
@Retention(RetentionPolicy.RUNTIME) public @interface Anno { String name() default "zhangsan"; }
@Anno(name="ttttttt") public class AnnotationImpl { @LogClass() public String getName() { return "aaaa"; } @LogClass(comments="cccccc") public String getValue() { return "bbbb"; } }
public static void main(String[] args) throws Exception { Class<?> clazz = Class .forName("com.ronghai.hfms.support.upload.AnnotationImpl"); Method[] method = clazz.getMethods(); boolean flag = clazz.isAnnotationPresent(Anno.class); if (flag) { Anno first = (Anno) clazz.getAnnotation(Anno.class); System.out.println("Annotation:" + first.name()); } for (int i = 0; i < method.length; i++) { LogClass log=method[i].getAnnotation(LogClass.class); if(log!=null){ System.out.println(1+i+"、"+log.comments()); } } }
Annotation:ttttttt
1、
2、cccccc
@Target:指定程序元定义的注释所使用的地方,它使用了另一个类:ElementType,是一个枚举类定义了注释类型可以应用到不同的程序元素以免使用者误用。
public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field declaration (includes enum constants) */ FIELD, /** Method declaration */ METHOD, /** Parameter declaration */ PARAMETER, /** Constructor declaration */ CONSTRUCTOR, /** Local variable declaration */ LOCAL_VARIABLE, /** Annotation type declaration */ ANNOTATION_TYPE, /** Package declaration */ PACKAGE }
@Retention:这个元注释和java编译器处理注释的注释类型方式相关,告诉编译器在处理自定义注释类型的几种不同的选择,需要使用RetentionPolicy枚举类。此枚举类只有一个成员变量,可以不用指明成名名称而赋值,看Retention的源代码:
public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }@Documented:是一个标记注释,表示注释应该出现在类的javadoc中,因为在默认情况下注释时不包括在javadoc中的。