说我有一个这样的注释:
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoConvert {
boolean enabled() default true;
}
和用它注释的类:
@AutoConvert
public class ExampleCommandToExample extends BaseConverter{}
在超类上我做了以下事情:
public void convert(){
Annotation annotation = (AutoConvert) this.getClass().getAnnotation(AutoConvert.class);
}
运行时一切正常!找到并正确设置注释!
但是!使用JUnit对convert方法进行单元测试: this.getClass()。getAnnotation(AutoConvert.class) 始终返回null。
测试如下:
@Test
public void convertTest(){
//when
exampleCommandToExample.convert();
}
运行单元测试时,反射是否找不到自定义注释? 有没有人对我有答案? 我真的很感激。
提前谢谢。
修改 好吧,它似乎是基于这种吸引... 我做了以下事情:
exampleCommandToExample = new ExampleCommandToExample() {
@Override
public Type overideSomeMethod() {
return type;
}
};
可能一个实例丢失了所有注释 如果我在实例化上覆盖一些方法?
答案 0 :(得分:3)
由于exampleCommandToExample
ref表示匿名类的实例,因此调用this.getClass().getAnnotation(AutoConvert.class)
会收集其级别的注释和所有继承的注释。
但是,此匿名实现示例中的@AutoConvert
未被继承,这就是为什么getAnnotation
返回null
,这与Java API中声明的行为完全对应:< / p>
如果存在这样的注释,则返回指定类型的此元素的注释,否则为null。
要解决此问题,只需添加
即可import java.lang.annotation.Inherited;
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface AutoConvert { /* no changes */ }
@Inherited
将使匿名实现的注释可见。