是否可以使用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!”吗?作为输出?
您是对的,子类化是当前使用 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 代理,以使这种重新定义更加灵活。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)