1

我正在使用 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 使用方面,即使thissource不存在?(静态方法调用或从静态方法调用)。还是我必须写3个方面?

谢谢。

4

2 回答 2

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和检查空值。ttoString()

于 2012-08-10T11:49:21.297 回答
0

是的,我认为您将不得不编写三个切入点 - 一个与您所拥有的内容一致,第二个是从静态方法调用,第三个是从对象调用静态方法,可能还有三个不同的建议,委托给上面的processInvocation方法

于 2012-08-03T11:43:32.227 回答