使用byteman修改方法参数

时间:2014-03-21 12:34:13

标签: java

我的课程如下所示

 public class Caller {

  private Calle calle = new Calle();

  public void invoke(final String arg) {
    calle.invoke(arg);
  }

}


public class Calle {

  public void invoke(final String arg) {

  }

}

public class Main {
  public static void main(final String[] args) {

   Caller caller = new Caller();
   caller.invoke("suman");

 }

}

我想写一个byteman规则来捕获caller.invoke("suman");方法调用并将参数“suman”修改为“suman1”。这意味着对于calle.invoke(arg);类中的Caller,该参数应该为“suman1”。我尝试使用byteman规则捕获参数,但我不知道如何修改参数。

你可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

以下2条规则将满足您的要求:

RULE trace Caller.invoke entry
CLASS your.package.Caller
METHOD invoke(java.lang.String)
AT ENTRY
IF true
DO
    traceln("::::::::: Caller.invoke");
    $1 = $1 + "1";
ENDRULE
RULE trace Calle.invoke entry
CLASS your.package.Calle
METHOD invoke(java.lang.String)
AT ENTRY
IF true
DO
    traceln("::::::::: Calle.invoke");
    traceln("Argument: " + $1);
ENDRULE

第一条规则“ trace Caller.invoke entry ”在Caller类的invoke方法的入口点处被注入,并通过在其值附加“1”来修改传递的参数。可以使用$ {arg number}语句在byteman规则中访问参数,在您的情况下,只有$ 1表示您的唯一(和第一个)参数。

第二条规则“ trace Calle.invoke entry ”只是在输入方法时打印传递给Calle类的invoke方法的参数,表明转换后的参数字符串已到达。