我在maven模块中创建了以下注释" A"
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface CacheDelete {...}
在同一个模块" A"中,我有TestPojo类,我在这里使用这个注释
@CacheDelete()
public void removeTestPojo(int id) {
}
我从模块" A"中的测试用例调用这个removeTestPojo()方法。这里一切都很好。我在建议中使用下面的代码得到了正确的注释。
模块中的建议方法代码CacheAspect类" A":
CacheDelete cacheDeleteAnnotation = getAnnotation((MethodSignature) joinPoint.getSignature(),
CacheDelete.class);
获取注释方法:
private <T extends Annotation> T getAnnotation(MethodSignature methodSignature,
Class<T> annotationClass) {
return methodSignature.getMethod().getAnnotation(annotationClass);
}
问题: 现在我有一个不同的模块&#34; B&#34;我在哪里使用&#34; A&#34; &#34; B&#34;中的一种方法模块使用@CacheDelete注释。
当我在模块中运行测试用例&#34; B&#34;对于带注释的方法和调试CacheAspect类,调试点来到我的建议,但我的get注释在这里返回null。 任何人都知道可能是什么原因?
答案 0 :(得分:1)
遇到问题它与不同的模块无关。我注释了一个接口实现的方法,并通过接口引用变量调用实现的方法。
所以当你使用:
(MethodSignature) proceedingJoinPoint.getSignature().getMethod()
从界面返回方法;
相反,我将以上代码替换为:
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
Method method = signature.getMethod();
String methodName = method.getName();
if (method.getDeclaringClass().isInterface()) {
method = proceedingJoinPoint.getTarget().getClass().getDeclaredMethod(methodName,
method.getParameterTypes());
}
所以,这将检查方法是否是接口,如果是,我将调用:
proceedingJoinPoint.getTarget().getClass().getDeclaredMethod()
给了我子类的方法。
奇怪的是,当我们通过接口调用子类方法时,当子类方法中使用的注释但是注释不在子类方法中传播时,调用传播到通知(AOP)。