2013-08-02 42 views
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" 
    } 

} 

我有什么办法只将参数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] 

回答

1

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

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

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

after(String someString) : myPointcut(someString) { 

} 
1

简单的解决方案,这将是所谓的varargs使用。更改签名的myMethod到:

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

然后,您可以通过尽可能String对象,你想,你可以像数组访问元素访问它们。例如,为了获得第一个,你需要做的:

String first = args[0];