1
public class MyClass {

    public void myMethod(String a, String b, String c, String d, String e, String f) {
        return true;
    }

}

public aspect MyAspect {

    pointcut myPointcut(String a, String b, String c, String d, String e, String f):
        execution (public void myMethod(String, String, String, String, String, String)) &&
        target(MyClass) &&
        args(a, b, c, d, e, f);

    after(String a, String b, String c, String d, String e, String f) : myPointcut(a, b, c, d, e, f) {
        // I only need parameter "b"
    }

}

我有什么方法可以只将 arg 传递String b给我的建议,因为我在这里不需要其他的?

我尝试了以下方法:

pointcut myPointcut(String b):
    execution (public void myMethod(String, String, String, String, String, String)) &&
    target(MyClass) &&
    args(b);

after(String b) : myPointcut(b) {
    // I only need parameter "b"
}

但我收到以下警告:

advice defined in MyAspect has not been applied [Xlint:adviceDidNotMatch]
4

2 回答 2

1

不是我可以在不更改方法签名的情况下看到。参数名称在运行时会丢失,因此您的建议与触发它的方法签名之间没有关联。换句话说,它不知道要传递什么字符串。

为了澄清,以下编译为与上面的代码相同。我们不知道 6 个字符串中的哪一个是您需要的:

pointcut myPointcut(String someString):
    execution (public void myMethod(String, String, String, String, String, String)) &&
    target(MyClass) &&
    args(someString);

after(String someString) : myPointcut(someString) {

}
于 2013-08-02T12:27:44.713 回答
1

对此的简单解决方案是使用所谓的varargs. 将签名更改myMethod为:

public boolean myMethod(String... args) { return true; }

然后,您可以传递任意数量的String对象,并且可以像访问数组中的元素一样访问它们。例如,要获得第一个,您需要执行以下操作:

String first = args[0];
于 2013-08-02T12:21:32.673 回答