如何从java中的源代码获取自定义注释?

时间:2014-05-12 01:48:43

标签: java unit-testing annotations

我正在尝试使用自定义注释来获取单元测试的一些统计信息。另一个人定义了一个自定义注释如下:

@Retention(RetentionPolicy.SOURCE)
@Target( { ElementType.METHOD, ElementType.TYPE})  
public @interface TimsID {
    String   id();
    String   description() default "";
}

我需要做的是从项目中的所有单元测试中提取此注释。

问题出现了:

RetentionPolicy定义为SOURCE,我不知道如何在单元测试中获取它。
我知道,如果它是RUNTIME,它可能会像这样反复阅读:

    Class<TestExample> obj = TestExample.class;

    // Process @TimsID
    if (obj.isAnnotationPresent(TimsID.class)) {

        Annotation annotation = obj.getAnnotation(TimsID.class);
        TimsID TimsID = (TimsID) annotation;
    }

但是现在它是'SOURCE',注释不会被编译器记录在类文件中,也不会在运行时由VM保留,因此无法反射性地读取它们。

定义自定义注释的人说他选择“SOURCE”的原因是我们只需要在源代码中统计这个注释,我们不需要在类文件甚至运行时编写这些自定义注释,所以我们只需要在源代码中进行注释分析。

我完成了这项工作,here is the step and code

2 个答案:

答案 0 :(得分:1)

SOURCE保留仅用于编译过程中。您可以查看APT(注释处理工具)以获取有关如何执行此类编译时注释处理逻辑的更多信息。 (但我不知道它能不能做你想做的事情)

答案 1 :(得分:0)

不幸的是,您必须更改源代码中的RetentionPolicy。除非在测试中,否则没有其他方法可以使注释在运行时可用于反射。