2013-08-02 3 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

메소드 서명을 변경하지 않고도 알 수 있습니다. 매개 변수 이름은 런타임에 손실되므로 조언을 트리거 한 메소드 서명과 상관 관계가 없습니다. 다른 말로하면 어떤 문자열을 전달해야할지 알 수 없습니다.

다음 내용은 위의 코드와 동일하게 컴파일됩니다. 우리는 6 개의 문자열 중 어느 것이 필요한 문자열인지 알 수 없습니다 :

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 전화의 사용 것을

나는 다음 기회로했습니다.

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

그런 다음, 당신이 원하는만큼 String 같은 개체를 전달할 수 있으며 배열에서 요소를 액세스처럼 액세스 할 수 있습니다 myMethod의 서명을 변경합니다. 예를 들어 첫 번째 코드를 얻으려면 다음을 수행해야합니다.

String first = args[0];