Java получает доступ к параметрам вызова функции через AspectJ - PullRequest
5 голосов
/ 11 февраля 2011
package a;
    Class X
        public fX(int i, String s);

package b;
    Class Y
        public fY(String arg1, String arg2, int arg3){
            ...
            ClassX.fX(1,"testY");
            // Need to execute some stuff right here after this call

        }

    Class Z
        public fZ(int n, int m){
            ClassX.fX(2,"testZ");
        }

Мне нужен такой pointcut и совет, что он будет указывать сразу после вызова метода ClassX.fX (1, ​​"testY") и даст мне доступ к ClassY.fY (String arg1, String arg2, int arg3) аргументы вызова функции (т. е. arg1, arg2 и arg3) одновременно,

Я пробовал этот, но он не сработал.

pointcut ParameterPointCut(String arg1, String arg2, int arg3) :
    withincode (public String ClassY.fY(String,String,int))&&
    call(public String ClassX.fX(int, String)) &&
    args(arg1,arg2,arg3);


after(String arg1, String arg2, int arg3): ParameterPointCut(arg1,arg2,arg3){
        System.out.println("arg1 =" + arg1);
    }

Что бы изменить pointcut и рекомендации длявзять эти значения в правильном месте?

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 12 февраля 2011

Вам нужно будет использовать шаблон червоточины, чтобы захватить параметры и сделать их доступными на более поздней точке соединения.

http://my.safaribooksonline.com/9781933988054/the_wormhole_pattern

Вот небольшая программа, которую я написал, которая решает проблемуВы описываете:

public aspect Aspect {

    pointcut outerMethod(String arg1, String arg2, int arg3) : 
        execution(public void Y.fY(String,String,int)) && 
        args(arg1, arg2, arg3); 

    pointcut innerMethod() : call(public void X.fX(int, String));

    after(String arg1, String arg2, int arg3) : 
        cflow(outerMethod(arg1, arg2, arg3)) &&
        innerMethod() {
        System.out.println("I'm here!!!");
        System.out.println(arg1 + " " + arg2 + " " + arg3);
    }

    public static void main(String[] args) {
        Y.fY("a", "b", 1);
    }
}

class X {
    public static void fX(int i, String s) {

    }
}

class Y {
    public static void fY(String arg1, String arg2, int arg3) {
        X.fX(1, "testY");
    }
}
3 голосов
/ 04 апреля 2011

Вы также можете использовать:

Object[] parameterList = thisJoinPoint.getArgs();

System.out.println(Arrays.toString(parameterList));
0 голосов
/ 04 апреля 2011
public aspect ExampleAspect {

pointcut methodCall() : execution(public void printStuff(..));

before(): methodCall(){
    System.out.println(thisJoinPoint.getArgs().toString()
            + "  <--- printed by the aspect");
}

}

class AspectTest {

public static void printStuff(String s) {
    System.out.println(s + "  <---  printed by the method");
}

public static void main(String[] args) {
    printStuff("printedParameter");
}
}
...