gpt4 book ai didi

java - 我可以使用 Byte Buddy 重新定义私有(private)方法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:23:17 24 4
gpt4 key购买 nike

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

考虑以下示例:

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.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 代理,从而使这种重新定义更加灵活。

关于java - 我可以使用 Byte Buddy 重新定义私有(private)方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25795109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com