gpt4 book ai didi

java - Byte Buddy 为构造函数实例化不带参数的类

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

我正在尝试实例化一个没有空参数构造函数的类(而且它的直接父类也没有空参数构造函数)

Class<?> newClass = new ByteBuddy();
.subclass(BufferedImage.class)
...
.make()
.load(BufferedImage.class.getClassLoader())
.getLoaded();
BufferedImage bufferedImage = dynamicTypeBufferedImage.getConstructor().newInstance();

我想知道这是否可以使用 byte buddy。目前我收到一条错误消息,指出未找到代理类的 getConstructor() 这很有意义,因为空参数构造函数不存在。有没有一种方法可以定义空参数构造函数以使该实例化起作用?

我试过:

...
.constructor(any()).intercept(to(new Object() {
public void construct() throws Exception {
System.out.println("CALLING XTOR");
}
}).andThen(SuperMethodCall.INSTANCE)) // This makes the difference!
...

来自here并给了我图像类没有 super()(这是 BufferedImage 的父类)的错误。

我也试过:

...
.defineConstructor(Visibility.PUBLIC)
.intercept(MethodCall
.invoke(superClass.getDeclaredConstructor())
.onSuper())
...

来自here

最后,我还尝试了 .subclass(type, ConstructorStrategy.Default.IMITATE_SUPER_CLASS); 模仿父类(super class)的方法,但这似乎没有添加空参数构造函数。

我想要的这个功能模仿了 cglib 使用增强器实例化其对象的方式。从我一直在阅读的内容中我知道字节伙伴应该让用户决定如何实例化。我想知道是否有一种简单的方法可以将默认实例化设置为空参数构造函数,因为我不关心在类中设置字段,而只想控制方法空间?

最佳答案

定义不以某种方式(直接或通过另一个构造函数)调用其 super 构造函数的 Java 构造函数是不合法的,因为它不能用字节代码表示,也不能在 Byte Buddy 中完成。

你可以做的是:

  1. 不要使用 ConstructorStrategy.Default.NO_CONSTRUCTORS 一起定义构造函数。
  2. 使用类似Objenesis 的库实例化一个类。

但请注意,Objenesis 使用的是不安全的 API, future 的 Java 版本可能不支持该 API。

关于java - Byte Buddy 为构造函数实例化不带参数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50478383/

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