用ByteBuddy重新定义静态方法

时间:2017-03-04 23:33:42

标签: byte-buddy

家庭主人可以帮助我,给我一个如何使用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

谢谢

1 个答案:

答案 0 :(得分:0)

每个类加载器只能加载一次类。为了替换方法,您需要使用Java代理挂钩到JVM的HotSwap功能。

Byte Buddy提供了一个使用这种代理的类加载策略,使用:

.load(Source.class.getClassLoader(), 
      ClassReloadingStrategy.fromInstalledAgent());

但是,这需要您安装Java代理。在JDK上,您可以通过ByteBuddyAgent.install()(包含在byte-buddy-agent工件中)以编程方式执行此操作。在JVM上,您必须在命令行上指定代理。