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

时间:2018-05-23 00:58:14

标签: java proxy jvm byte-buddy

我试图实例化一个没有空参数构造函数的类(并且它的直接父级也没有空参数构造函数)

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

我想知道这是否可以使用字节伙伴。目前我收到错误,说找不到代理类的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

给了我Image类的错误,没有super()(这是BufferedImage的父类)。

我也尝试过:

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

来自here

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

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

1 个答案:

答案 0 :(得分:1)

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

你能做的是:

  1. 未使用ConstructorStrategy.Default.NO_CONSTRUCTORS完全定义构造函数。
  2. 使用像Objenesis这样的库来实例化一个类。
  3. 但请注意,Objenesis正在使用未来Java版本可能不支持的不安全API。