我可以使用ByteBuddy设置传出方法/构造函数调用吗?

时间:2017-11-13 13:47:43

标签: java profiling javassist bytecode-manipulation byte-buddy

我有一个项目,我使用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实现它的方式。

1 个答案:

答案 0 :(得分:0)

您可以使用Advice更改方法的参数,这允许您在原始方法执行之前更改参数:

@Advice.OnMethodEnter
static void enter(@Advice.Argument(value = 0, readOnly = false) int arg) {
  arg = 0;
}

这样做,上面的代码将添加到您需要使用move ElementMatcher进行定位的named("move")方法。