Я думал использовать библиотеку Reflections, чтобы получить класс, который реализует менеджер с определенным значением аннотации.Дженерики не могут отличить объект от класса интерфейса java
я написал такой код:
public enum Reflection {
INSTANCE;
Reflection() {
managersRef = new Reflections("com.company.manager");
}
private final Reflections managersRef;
public Manager getManagerImplWithName(String name, Class<? extends Manager> subType) {
Set<?> managers = managersRef.getSubTypesOf(subType);
for (Object clazz : managers) {
Service serviceAnno = ((Class<?>) clazz).getAnnotation(Service.class);
if (serviceAnno != null && !StringUtils.isEmpty(serviceAnno.name()) && serviceAnno.name().equals(name))
return (Manager) clazz;
}
return null;
}
}
Менеджер интерфейс. SubType - это класс, который реализует Manager, например. ProductManager/OfficeManager
Я ищу любой класс, который реализует его с помощью аннотации @Service (name = name).
Это прекрасно работает до тех пор, пока не опустится линия (менеджер). Я получаю:
java.lang.ClassCastException: java.lang.Class cannot be cast to com.mycompany.manager.Manager
Что не так? В проверке я вижу, что тип clazz - ProductManager, который реализует Manager
Вы не дали нам достаточно подробностей для решения проблемы. Что такое 'managerRef'? Где объявлен метод 'getSubTypeOf'? –
Я редактировал код. Отражения https://code.google.com/p/reflections/ – Dejell
Я считаю, что вам нужен экземпляр 'Manager', но у вас есть объект класса. – qqilihq