我正在尝试使用自定义注释来获取单元测试的一些统计信息。另一个人定义了一个自定义注释如下:
@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。
答案 0 :(得分:1)
SOURCE保留仅用于编译过程中。您可以查看APT(注释处理工具)以获取有关如何执行此类编译时注释处理逻辑的更多信息。 (但我不知道它能不能做你想做的事情)
答案 1 :(得分:0)
不幸的是,您必须更改源代码中的RetentionPolicy
。除非在测试中,否则没有其他方法可以使注释在运行时可用于反射。