2

まず、非常に印象的なバイトコード操作ライブラリーの 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 を介してサブクラスを作成します。これが不可能な場合でも、別の方法またはこの動作に近似するための提案を歓迎します。

4

1 に答える 1