gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:49:53 24 4
gpt4 key购买 nike

我从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com