是否可以使用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!”作为输出?
答案 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代理的代理构建器,以使这种重新定义更加灵活。