0

我有如下所示的课程

 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 规则捕获参数,但我不知道如何修改参数。

你能帮忙吗?

4

1 回答 1

1

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

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 类的调用方法的入口点注入,并通过将“1”附加到其值来修改传递的参数。可以使用 ${arg number} 语句在 byteman 规则中访问参数,在您的情况下 $1 是您唯一(也是第一个)参数。

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

于 2015-03-25T15:11:32.417 回答