我有一个项目,我使用Javassist来记录传出的方法/构造函数调用,代码如下:
CtMethod cm = ... ;
cm.instrument(
new ExprEditor() {
public void edit(MethodCall m)
throws CannotCompileException
{
if (m.getClassName().equals("Point")
&& m.getMethodName().equals("move"))
m.replace("{ $1 = 0; $_ = $proceed($$); }");
}
});
将“0”分配给被调用方法的第一个参数,然后继续进行原始调用,也就是说,如果cm
表示方法someMethod
,我们会修改对{{1}的传出调用来自Point::move
:
someMethod
我现在正在尝试迁移到 ByteBuddy ,因为我希望这些类与(在线)JaCoCo 兼容。我已经设法“从内部”检测方法和构造函数(检测被调用的方法本身),但我没有找到任何方法“从外部”(从其他地方调用这些方法的调用)。有没有办法用ByteBuddy做到这一点?
这个问题与another which asked for a way to catch constructor exceptions有关,因为这是我使用Javassist实现它的方式。
答案 0 :(得分:0)
您可以使用Advice
更改方法的参数,这允许您在原始方法执行之前更改参数:
@Advice.OnMethodEnter
static void enter(@Advice.Argument(value = 0, readOnly = false) int arg) {
arg = 0;
}
这样做,上面的代码将添加到您需要使用move
ElementMatcher
进行定位的named("move")
方法。