AspectJ:这个和目标上下文

时间:2012-08-03 11:09:39

标签: java aspectj

我使用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个方面?

感谢。

2 个答案:

答案 0 :(得分:3)

如果您愿意动态确定targetthis个对象,也可以使用一个切入点+一个建议。我在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方法