我可以使用Byte Buddy重新定义私有方法吗?

时间:2014-09-11 18:56:34

标签: java bytecode byte-buddy

是否可以使用Byte Buddy重新定义类的私有方法?似乎使用Byte Buddy的入口点总是对现有类进行子类化。这样做时,显然不可能重新定义父类的私有方法(至少不能在父类中使用重新定义的方法)。

考虑以下示例:

public class Foo {
    public void sayHello() {
        System.out.println(getHello());
    }

    private String getHello() {
        return "Hello World!";
    }
}

Foo foo = new ByteBuddy()
    .subclass(Foo.class)
    .method(named("getHello")).intercept(FixedValue.value("Byte Buddy!"))
    .make()
    .load(Main.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
    .getLoaded()
    .newInstance();
foo.sayHello();

输出将是“Hello World!”。有没有机会得到“Byte Buddy!”作为输出?

1 个答案:

答案 0 :(得分:2)

您是正确的,子类化是目前使用Byte Buddy创建类的唯一选项。但是,从下一周发布的0.3版开始,这将更改,以便您还可以重新定义现有类。然后,类重新定义将如下所示:

ClassReloadingStrategy classReloadingStrategy = ClassReloadingStrategy
                                                   .fromInstalledAgent();
new ByteBuddy()
  .redefine(Foo.class)
  .method(named("getHello"))
  .intercept(FixedValue.value("Byte Buddy!"))
  .make()
  .load(Foo.class.getClassLoader(), classReloadingStrategy);
assertThat(foo.getHello(), is("Byte Buddy!"));
classReloadingStrategy.reset(Foo.class);
assertThat(foo.getHello(), is("Hello World"));

这种方法利用了HotSpot的HotSwap机制,由于无法添加方法或字段,因此机制非常有限。使用Byte Buddy版本0.4,Byte Buddy将能够重新定义卸载的类并提供用于实现自定义Java代理的代理构建器,以使这种重新定义更加灵活。