Byte Buddy可以访问方法的局部变量名吗?

时间:2015-01-11 03:15:40

标签: java bytecode local-variables byte-buddy

假设我有一个方法m

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

我想使用ByteBuddy来检测代码,以便在doSomething中调用m时,它会自动将foobar的值放入{{} 1}},几乎看起来像:

HashMap

无论如何都要通过ByteBuddy来做这个仪器吗?

1 个答案:

答案 0 :(得分:1)

Byte Buddy中有内置方式以这种方式重新定义方法m。然而,Byte Buddy自愿公开ASM API,在其上实现了Byte Buddy。 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);