java - 使用 byte-buddy 子类化抽象参数化类

标签 java bytecode 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

关于java - 使用 byte-buddy 子类化抽象参数化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31245465/

相关文章:

java - 无法使用 Apache Camel 3.1.0 将 XML 转换为 JSON

java - 玩!框架在编译时挂起,没有报告错误

java - 访问 .class 文件中的符号表

python - 具有任意局部变量的 exec() 字节码?

java - 如何使用 javaassist 或任何其他 api 获取所有方法的正确行号?

java - JxBrowser 6 在 osx el capitan 中挂起

java - 如何在Java中逐字节更改WAV文件的容量?

java - 如何将字段添加到 ByteBuddy 中的类并在方法拦截器中设置/获取该值

java - 在项目中使用 mockito-inline 会抛出 "Mockito cannot mock this class"错误

java - 无法使用 javaagent 为 spring boot uber jar 应用程序检测 apache httpclient