7

假设我有一个方法m

public void m() {
  String foo = "foo";
  int bar = 0;
  doSomething(foo, bar);
}

我想使用 ByteBuddy 来检测代码,以便在调用doSomethingm,它会自动将 和 的值foo放入baraHashMap中,几乎看起来像:

public void m() {
  String foo = "foo";
  int bar = 0;
  context.put("foo", foo); // new code injected 
  context.put("bar", bar); // new code injected
  doSomething(foo, bar);
}

无论如何可以通过 ByteBuddy 进行此检测吗?

4

1 回答 1

3

Byte Buddy 中有内置的方法可以m用这种方式重新定义方法。然而,Byte Buddy 自愿公开了在其之上实现 Byte Buddy 的 ASM API。ASM 提供了相当广泛的文档,它将向您展示如何执行此操作。但是我可以告诉你,这将是相当多的代码。请注意,您需要在启用调试符号的情况下编译任何方法,否则这些内部变量在运行时不可用。

但是,您确定要这样做吗?在不知道您的确切用例的情况下,感觉这是一个坏主意。通过实施此解决方案,您可以使局部变量的名称成为应用程序的一部分,而不是让它们成为实施细节。

因此,我建议您使用该doSomething方法。这是否足以满足您在 Byte Buddy 中使用如下拦截器轻松完成的工作:

class Interceptor {
  void intercept(@Origin Method method, @AllArguments Object[] args) {
    int index = 0;
    for(Parameter p : method.getParameters()) {
      context.add(p.getName(), args[index++]); 
    }
  }
}

然后可以按如下方式使用此拦截器:

MethodDelegation.to(new Interceptor()).andThen(SuperMethodCall.INSTANCE);
于 2015-01-11T13:24:16.753 回答