Я пытаюсь выделить магию Guava TypeToken
для класса, который параметризуется параметром родового типа, но я получаю ClassNotFoundException
при попытке создайте экземпляр метода Class.forName(String)
.Как создать экземпляр объекта класса для параметризованного класса с использованием отражения и Guava TypeToken
public class EnumeratedMenu<E extends Enum<E>,T extends EnumeratedBean<E>> {
private final TypeToken<EnumeratedMenu<E,T>> typeToken =
new TypeToken<EnumeratedMenu<E,T>>(getClass()) { };
private Class<T> getBean() {
TypeToken<?> genericBeanParam = typeToken.resolveType(EnumeratedMenu.class.getTypeParameters()[1]);
try {
//This generates a ClassNotFoundException because of the generic type parameter that EnumeratedBean has.
return (Class<T>)Class.forName(genericBeanParam.getType().getTypeName());
} catch(ClassNotFoundException e) {
log.error("Unable to find the class definition for {}", genericBeanParam.getType().getTypeName());
log.catching(e);
}
}
}
Я получаю это исключение:
«Не удалось найти определение класса для EnumeratedBean<ContextMenuOption$ContextType>
»
ContextMenuOption$ContextType
тип выполнения родового enum
параметра для EnumeratedBean
. Как получить объект класса, который я хочу?
Разъяснение:
Мне нужно построить и экземпляр класса для использования с объектом строитель, который построит пункт меню, как это показано ниже:
T optionBean = beanFactory.create(beanClass);
IEnumeratedMenuOptionBuilder<E,T> builder = new EnumeratedMenuOptionBuilder<>(optionBean);
builder.setDriver(getDriver()).setTimeoutInSeconds(getTimeoutInSeconds())
.setEnumerationFunction(getEnumerationFunction());
Спасибо. Это поставило меня на правильный путь, чтобы заставить это работать. – Selena