我的课程如下所示
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规则捕获参数,但我不知道如何修改参数。
答案 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方法的参数,表明转换后的参数字符串已到达。