我需要为几个'周围执行一些常用代码。建议。所以,我已将公共代码移动到一个函数。但我遇到的问题是,proceed()在这个常用函数中不起作用。请参阅下面的代码。
aspect MyAspect {
pointcut myPointCut() : execution(* com.test.MyTestInterface.*(..));
Object around() : myPointCut() {
Object retVal = null;
try {
ProceedingJoinPoint pjp = (ProceedingJoinPoint) thisJoinPoint;
myfunction(pjp);
} catch (Throwable e) {
e.printStackTrace();
}
return retVal;
}
public void myfunction(ProceedingJoinPoint pjp) {
System.out.println("Inside myfunction()" + pjp.getSignature());
pjp.proceed();
}
}
将thisJoinPoint转换为ProceedingJoinPoint并不起作用。 "在myfunction()"打印,但下一个语句不执行切入点截获的方法。
有没有办法实现这个目标?
答案 0 :(得分:1)
我没有使用传统语法,但我想我可能有@AspectJ Syntax的解决方案:
@Aspect
public class MyAspect {
@Around("execution(* *(..)) && !within(MyAspect)")
public Object aroundTest(ProceedingJoinPoint thisJoinPoint){
Object retVal = null;
try {
myfunction(thisJoinPoint);
} catch (Throwable e) {
e.printStackTrace();
}
return retVal;
}
public void myfunction(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("Inside myfunction(): " + pjp.getSignature());
pjp.proceed();
}
}
答案 1 :(得分:1)
您可以将proceed
调用包装在您在around advice方法内定义的匿名类的方法中。如图1所示this paper:
interface Proceedable {
public void doProceed();
}
public aspect MyAspect {
public void auxMethod(Proceedable p) {
// Can invoke p.doProceed()
}
void around(): somePointcut() {
auxMethod(new Proceedable() {
public void doProceed() { proceed(); }
});
}
}