假设我有一个方法m
:
public void m() {
String foo = "foo";
int bar = 0;
doSomething(foo, bar);
}
我想使用ByteBuddy来检测代码,以便在doSomething
中调用m
时,它会自动将foo
和bar
的值放入{{} 1}},几乎看起来像:
HashMap
无论如何都要通过ByteBuddy来做这个仪器吗?
答案 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);