对于不同maven模块

时间:2017-03-15 08:07:51

标签: java annotations aop

我在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。 任何人都知道可能是什么原因?

1 个答案:

答案 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)。