簡體   English   中英

使用字節伙伴對抽象參數化類進行子類化

[英]Subclass an abstract parameterized class with byte-buddy

我從 byte-buddy 開始,這是一個非常令人印象深刻的字節碼操作庫。 它工作正常,但我在對抽象的參數化類進行子類化時遇到問題:

public interface Task<DTO extends IDatabaseObject> {

  void execute(DTO input);

  Class<DTO> getDataObjectClass();
}

這是抽象類:

public abstract class AbstractTask<T extends IDatabaseObject> implements Task<T> {

  protected Class<T> dataObjectClass = /* Call to an external method which retrieves the class from T */;

  @Override
  public Class<T> getDataObjectClass() {
    return dataObjectClass;
  }
}

我想創建一個擴展的具體類

public abstract class AbstractTask<T extends IDatabaseObject> implements Task<T> {

  protected String SUCCESS_MESSAGE_PREFIX = "task.mess.";

  protected Class<T> dataObjectClass;// = Introspector.getParameterizedTypeClass(this, AbstractTask.class, 0);

  @Override
  public Class<T> getDataObjectClass() {
    return dataObjectClass;
  }

  @Override
  public String getSuccessMessage(IDatabaseObject t) {
    final String messageKey = SUCCESS_MESSAGE_PREFIX + this.getClass().getSimpleName();
    final MessagesFactory messagesFactory = MessagesFactory.getInstance();
    return messagesFactory.isPresent(messageKey) ? messagesFactory.get(messageKey) : "";
  }
}

我想創建一個AbstractTask的具體類,以實現以下斷言:

createConcreteImplementation(Person.class).getDataObjectClass() == Person.class

其中createConcreteImplementation方法通過 Byte Buddy 創建一個子類。 即使這是不可能的,我也歡迎對替代方法或近似這種行為的建議。

Byte Buddy 目前不完全支持泛型類型。 這是我目前正在使用的東西(我寫了 Byte Buddy),我希望在今年的某個時候支持這個功能。

但是,您始終可以覆蓋 Byte Buddy 以覆蓋getDataObjectClass方法,以便從方法返回類而不是使用字段的值:

AbstractTask<?> createConcreteImplementation(Class<?> type)
  return new ByteBuddy()
    .subclass(AbstractTask.class)
    .method(named("getDataObjectClass"))
    .intercept(FixedValue.value(new TypeDescription.ForLoadedType(type))) // (*)
    .make()
    .load(type.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
    .getLoaded();
}

1顯式包裝是必要的,因為這將消失的下一個版本中的一個錯誤: https://github.com/raphw/byte-buddy/pull/34#issuecomment-118888979

暫無
暫無

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

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