2011-02-11 78 views
5
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"); 
     } 

访问函数调用参数,我需要这样一个切入点和建议,这将ClassX.fX后右键点 (1,“暴躁”)方法调用,并给我访问 到ClassY.fY (ARG1字符串,字符串ARG2,INT ARG3)函数调用的参数(即ARG1,ARG2和参数3)在同一时间,的Java通过的AspectJ

我想这一个,但它没有工作。

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); 
    } 

什么是切入点和建议的更改将这些值在正确的位置?

在此先感谢。

回答

7

你将不得不使用一个虫洞模式拍摄参数,并让他们在稍后的连接点。

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

Object[] parameterList = thisJoinPoint.getArgs(); 

System.out.println(Arrays.toString(parameterList)); 
0
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"); 
} 
}