gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:32:27 27 4
gpt4 key购买 nike

假设我有一个方法m:

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

我想使用 ByteBuddy 检测代码,以便在 m 中调用 doSomething 时,它会自动将 foo 的值和barHashMap 中,看起来很像:

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 进行这种检测?

最佳答案

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);

关于java - Byte Buddy 可以访问方法的局部变量名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27883634/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com