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,“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);
}
将这些值放在正确的位置会有什么切入点和建议更改?
提前致谢。
答案 0 :(得分: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");
}
}
答案 1 :(得分:3)
您也可以使用:
Object[] parameterList = thisJoinPoint.getArgs();
System.out.println(Arrays.toString(parameterList));
答案 2 :(得分: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");
}
}