我可以使用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!” 作为输出?

你是正确的,子类化是目前用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代理的代理构建器,以使这种重新定义更加灵活。