家庭主人可以帮助我,给我一个如何使用byte-buddy 1.6.9重新定义静态方法的提示吗?
我试过这个:
public class Source {
public static String hello(String name) {return null;}
}
public class Target {
public static String hello(String name) {
return "Hello" + name+ "!";
}
}
String helloWorld = new ByteBuddy()
.redefine(Source.class)
.method(named("hello"))
.intercept(MethodDelegation.to(Target.class))
.make()
.load(getClass().getClassLoader())
.getLoaded()
.newInstance()
.hello("World");
我得到以下例外:
线程“main”中的异常java.lang.IllegalStateException:无法注入已加载的类型:class delegation.Source
谢谢
答案 0 :(得分:0)
每个类加载器只能加载一次类。为了替换方法,您需要使用Java代理挂钩到JVM的HotSwap功能。
Byte Buddy提供了一个使用这种代理的类加载策略,使用:
.load(Source.class.getClassLoader(),
ClassReloadingStrategy.fromInstalledAgent());
但是,这需要您安装Java代理。在JDK上,您可以通过ByteBuddyAgent.install()
(包含在byte-buddy-agent工件中)以编程方式执行此操作。在JVM上,您必须在命令行上指定代理。