簡體   English   中英

Byte Buddy實例化沒有構造函數參數的類

[英]Byte Buddy instantiate class without parameters for constructor

我試圖實例化一個沒有空參數構造函數的類(它的直接父級也沒有空參數構造函數)

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

我想知道這是否可以使用字節伙伴。 目前我收到一個錯誤,說getConstructor()代理類的getConstructor() ,這是有道理的,因為空參數構造函數不存在。 有沒有辦法定義空參數構造函數,以便此實例化工作?

我努力了:

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

來自這里並給我Image類的錯誤沒有super() (這是BufferedImage的父類)。

我也嘗試過:

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

來自這里

最后,我還嘗試了.subclass(type, ConstructorStrategy.Default.IMITATE_SUPER_CLASS); 模仿超類的方法,但這似乎沒有添加一個空參數構造函數。

我想要的這個功能,模仿cglib使用增強器實例化其對象的方式。 我知道從我讀過的那個字節伙伴應該讓用戶決定如何實例化。 我想知道是否有一種簡單的方法可以將默認實例設置為空參數構造函數,因為我不關心在類中設置字段而只是想控制方法空間?

定義一個不以某種方式(直接或通過另一個構造函數)調用其超級構造函數的Java構造函數是不合法的,因為它不能用字節代碼表示,它不能在Byte Buddy中完成。

你能做的是:

  1. 不使用ConstructorStrategy.Default.NO_CONSTRUCTORS
  2. 使用像Objenesis這樣的庫來實例化一個類。

但請注意,Objenesis正在使用未來Java版本可能不支持的不安全API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM