假设我有一个
的方法签名public void accept(ParentInterface parent)
其中ParentInterface是一个接口。我希望我的切入点只能专门针对一个类TestA,而不是一个类TestB,它们都实现了ParentInterface。
目前,我有以下切入点:
@Pointcut("call(public void accept(package.ParentInterface))")
但是这会捕获accept接受TestB实例的实例。有没有办法解决这个问题?
答案 0 :(得分:0)
接口+实现+驱动程序应用程序:
package de.scrum_master.app;
public interface ParentInterface {}
package de.scrum_master.app;
public class TestA implements ParentInterface {}
package de.scrum_master.app;
public class TestB implements ParentInterface {}
package de.scrum_master.app;
public class Application {
public void accept(ParentInterface parent) {}
public static void main(String[] args) {
Application application = new Application();
application.accept(new TestA());
application.accept(new TestB());
}
}
通过args()
+切入点方法签名固定参数类型的方面:
package de.scrum_master.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import de.scrum_master.app.TestA;
@Aspect
public class MyAspect {
@Pointcut("call(public void accept(de.scrum_master.app.ParentInterface)) && args(argument)")
static void acceptCalls(TestA argument) {}
@Before("acceptCalls(argument)")
public void intercept(TestA argument, JoinPoint thisJoinPoint) {
System.out.println(thisJoinPoint + " -> " + argument);
}
}
控制台日志:
call(void de.scrum_master.app.Application.accept(ParentInterface)) -> de.scrum_master.app.TestA@4a574795