Byte Buddy 实例化 class 没有构造函数的参数

Byte Buddy instantiate class without parameters for constructor

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

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

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

我试过:

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

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

我也试过:

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

来自 here

最后我也尝试了.subclass(type, ConstructorStrategy.Default.IMITATE_SUPER_CLASS);的方式模仿superclass但是这个好像没有加空参构造函数

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

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

您可以做的是:

  1. 不使用 ConstructorStrategy.Default.NO_CONSTRUCTORS 定义构造函数。
  2. 使用像 Objenesis 这样的库来实例化一个 class。

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