问题描述
我有以下代码,其中我的切入点基于界面上的注释。如果调用方方法上的对象变量被定义为实现类,则它不起作用。但是如果我将(相同的对象)它转换为 Interface 那么它就可以工作了!!
package sample;
public interface MyInterface {
@Write //runtime annotation
public void methodA();
}
// In Write.java file
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
public @interface Write {
}
package sample;
public class MyImpl implements MyInterface {
public void methodA() {
System.out.println("MyImpl");
}
}
两个方面定义为
@Aspect
public class MySimpleAspect {
@Around("execution(public * sample.MyImpl.*(..))")
public Object simpleAround(ProceedingJoinPoint point) throws Throwable {
System.out.println("in Simple Aspect");
return point.proceed();
}
}
@Aspect
public class MyComplexAspect {
@Around("call(@Write * sample.MyInterface+.*(..))") // doesn't get invoked if <includes> is part of pom
public Object complexAround(ProceedingJoinPoint point) throws Throwable {
System.out.println("in complex Aspect");
return point.proceed();
}
}
测试类
package sample;
import org.junit.Test;
public class MyTest {
@Test
public void testMyImpl() {
System.out.println("-- Using MyImpl.methodA() ---");
MyImpl my = new MyImpl(); //does not work
my.methodA();
System.out.println("\n-- Using myinterface.methodA() ---");
MyInterface myinterface = my; //works
myinterface.methodA();
}
}
-------------------------------------------------------
T E S T S
-------------------------------------------------------
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
Running sample.MyTest
-- Using MyImpl.methodA() ---
in Simple Aspect
MyImpl
-- Using myinterface.methodA() ---
in complex Aspect
in Simple Aspect
MyImpl
Tests run: 1,Failures: 0,Errors: 0,Skipped: 0,Time elapsed: 0.064 sec
更新
用更多代码和输出更新了问题,并删除了 pom/maven 相关的东西,因为它原来是纯粹的 aspectj 问题而不是 maven
- AspectJ 版本 1.9.6
- AspectJ Maven 插件 1.11
- JDK 1.8
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)