我使用aspectj来分析我的程序。目前我的方面看起来像:
@Aspect
public class InvokeAspect {
@Before("anyCall(t, s)")
public void processInvocation(JoinPoint point, JoinPoint.EnclosingStaticPart enclosingStatic, Object t, Object s){
System.out.println("***");
System.out.println("Invoker: " + s.toString());
System.out.println("Invoker: " + enclosingStatic.getSignature().toLongString());
System.out.println("Invoked object: " + t.toString());
System.out.println("Invoked: " + point.getSignature().toLongString());
System.out.println("");
System.out.println("***");
}
@Pointcut("call(* *(..)) && !within(cz.cvut.kbss.odra..*) && target(t) && this(s)")
public void anyCall(Object t, Object s){}
}
一切都按预期工作,但即使此或来源不存在,是否有任何方法可以使用方面来控制aspectj? (静态方法调用或静态方法调用)。或者我必须写3个方面?
感谢。
答案 0 :(得分:3)
如果您愿意动态确定target
和this
个对象,也可以使用一个切入点+一个建议。我在AspectJ语法中写这个是因为我对POJO注释样式感到不舒服:
public aspect InvokeAspect {
pointcut anyCall() : call(* *(..)) && !within(cz.cvut.kbss.odra..*);
before() : anyCall() {
Object s = thisJoinPoint.getThis();
Object t = thisJoinPoint.getTarget();
// and so forth
}
}
现在您可以打印或记录任何适合您的内容。如果要在s
上调用t
等方法,请注意检查toString()
和{{1}}是否为空值。
答案 1 :(得分:0)
是的,我认为你必须写三个切入点 - 一个沿着你所拥有的,第二个来自静态方法的调用,第三个用于从一个对象到一个静态方法的调用,可能还有三个不同的建议,委托上面的processInvocation
方法