通过反射查找属于通过 CGLIB 代理的类的方法的注释时,我遇到了一种奇怪的行为。我们在 Spring 中使用 CGLIB,如果我只使用注释对方法进行注释,则效果很好(我可以通过getAnnotations()
对应Method
对象上的方法检索注释)。如果我用 2 个注释来注释该方法(无论注释的顺序如何),getAnnotations()
只需 return null
. 两个注释都有RetentionPolicy.RUNTIME
.
我读到 CGLIB 存在一些问题,但奇怪的是它只适用于一个注释,当我放置 2 个注释时它返回 null。
有什么建议么?
(使用 Spring 3.0.5 和 CGLIB 2.2.2)
添加代码:
第一个注释是:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Produces {
ResultType[] value();
}
第二个注释是
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface JamonMonitored {
String type() default "";
String tag() default "";
}
用于检查注释的代码块是
Collection<Method> candidates = Collections2.filter(Arrays.asList(executorInstance.getClass().getMethods()), new Predicate<Method>() {
@Override
public boolean apply(Method input) {
return input.getAnnotation(Produces.class) != null;
}
});
if (candidates.isEmpty()) {
// throws exception
}
如果我同时使用 @Produces 和 @JamonMonitored 注释方法,getAnnotation(Produces.class)
则始终为null
.