2014-02-16 2 views
1

Я думал использовать библиотеку 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

+0

Вы не дали нам достаточно подробностей для решения проблемы. Что такое 'managerRef'? Где объявлен метод 'getSubTypeOf'? –

+0

Я редактировал код. Отражения https://code.google.com/p/reflections/ – Dejell

+0

Я считаю, что вам нужен экземпляр 'Manager', но у вас есть объект класса. – qqilihq

ответ

1

Вы не можете нанести объект Class в экземпляр этого класса. Я не уверен, что это действительно то, что вы хотите сделать, но вы можете создать экземпляр из объекта Class.

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) ((Class<?>) clazz).newInstance(); 
    } 
    return null; 
} 
+0

Я получаю «метод newInstance() не определен для типа Object« – Dejell

+0

Я получаю: «Несоответствие типа: невозможно преобразовать из захвата типа элемента № 2-из? В класс » в строку цикла for – Dejell

+0

вы получаете это, когда вы вызываете newInstance? –

0

Экземпляры Class<Manager>, представляющие объекты, которые говорят вам что-то о класс Manager, экземпляры Manager представляющих объекты менеджер - ясно, что они не совпадают и не могут быть отлиты друг в друга.

Смежные вопросы