[计算机软件及应用]注解
编译器要求注解的参数参数不能是不确定值,即要么在定义注解的时候就进行赋值,要么在使用的时候进行赋值。 如果定义一个参数而未进行赋值,则编译器会抛出一个错误:The annotation must define the attribute value。 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ID { public String value(); public String description() default ""; } public class Person { @ID("personID") private Integer id; } 如果没有读取分析注解的工具,那注解就不会比注释更有用。 JDK5扩展了反射机制的API,可以帮助程序员有效的创建这类工具,而且,它还提供了一个外部工具apt,用于帮助程序员分析处理注解。 要想使用反射去读取注解,必须将Retention的值选为Runtime Apt是由sun开发的一款用于处理注解的工具。 apt与javac一样用于处理源代码级别的命令。 默认情况下apt会在代码未编译前对代码进行分析处理。 Apt首先通过注解处理器分析处理用户编写的源文件,如果该轮处理的过程中产生了新文件,则apt会对产生的文件进行新一轮的处理,直至不再产生新文件为止,然后将这些文件一同编译,因此一般情况下apt命令包含了javac的功能。 apt是一个命令行工具,与之配套的还有一套用来描述程序语义结构的Mirror API。 Mirror API(com.sun.mirror.*)描述的是程序在编译时刻的静态结构。通过Mirror API可以获取到被注解的Java类型元素的信息,从而提供相应的处理逻辑。具体的处理工作交给apt工具来完成。 编写注解处理器的核心是AnnotationProcessorFactory和AnnotationProcessor两个接口。后者表示的是注解处理器,而前者则是为某些注解类型创建注解处理器的工厂。 编写Apt应用一般包括以下四个步骤: 编写需要进行注解处理的类(一般地,这些类应该带有需要处理的注解)。 实现至少一个AnnotationProcessorFactory。 实现AnnotationProcessor。 使用APT命令行,执行注解处理。 描述代码分工安排的注解。通过该注解可以在源代码中记录每个类或接口的分工和进度情况。 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Assignment { String assignee(); int effort(); double finished() default 0; } AnnotationProcessorFactory接口有三个方法: getProcessorFor是根据注解的类型来返回特定的注解处理器; supportedAnnotationTypes是返回该工厂生成的注解处理器所能支持的注解类型; supportedOptions用来表示所支持的附加选项。在运行apt命令行工具的时候,可以通过-A来传递额外的参数给注解处理器,如-A verbose=true。当工厂通过 supportedOptions方法声明了所能识别的附加选项之后,注解处理器就可以在运行时刻通过AnnotationProcessorEnvironment的getOptions方法获取到选项的实际值。 public class AssignmentApf implements AnnotationProcessorFactory { public AnnotationProcessor getProcessorFor(Set atds,? AnnotationProcessorEnvironment env) { if (atds.isEmpty()) { return AnnotationProcessors.NO_OP; } return new AssignmentAp(env); //返回注解处理器 } public Collection supportedAnnotationTypes() { return Collections.unmodifiableList(Arrays.asList("annotation.As