我从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创建子类。即使这是不可能的,我也欢迎采用替代方法或近似这种行为的建议。
答案 0 :(得分:2)
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