2014-01-21 4 views
-1

У меня есть метод, как это:Как создать экземпляр класса, расширяющего интерфейс?

public IMyInterface factoryMethod(Class<? extends IMyInterface> concreteClass){ 
    IMyInterface o = concreteClass.newInstance(); 
    //...some stuff 
    return o; 
} 

Если метод вызывается я получаю исключение: java.lang.NoClassDefFoundError: packages/IMyInterface

Кажется, что он пытается найти класс IMyInterface, а затем найти его конструктор. Конечно, это терпит неудачу.

Как исправить этот метод?

+2

Вы уверены, что IMyInterface находится на вашем пути к классу? Обычно NoClassDefFoundError является ошибкой во время выполнения, вызванной проблемами класса. –

+1

Можете ли вы создать экземпляр своего класса без отражения? 'NoClassDefFoundError' обычно происходит, когда класс, зависящий от вашего кода, был представлен в пути к классу во время компиляции, но не находится в пути к классам при выполнении кода. – Pshemo

+0

Можете ли вы показать фрагменты остальной части вашего кода. Например, IMyInterface? – Jason

ответ

1

Я проверил ваш код и его работоспособность. Но я также смог воспроизвести вашу проблему.

Предполагая, что вы звоните

factoryMethod(MyClass.class); 

Тогда, если класс «MyClass» находится внутри его СОБСТВЕННЫХ файлов классы его прекрасно работать только с обеспечивая

concreteClass.newInstance(); 

При наличии работы по осуществлению класс как внутренний класс Тип, Класс не найден Исключено.

Причина заключается в том, что внутренний класс на самом деле типа вложенного класса, и, следовательно, создание экземпляра возможно только при работе с ограждающими класса, а также.

В приведенном ниже примере метод newInstance() использовался вместе с внутренним классом.

public class Test { 

    public class MyClass implements MyInterface { 
    } 

    public interface MyInterface { 
    } 

    public static void main(String[] args){ 
     MyInterface ret = method(MyClass.class); 

     if (ret instanceof MyClass){ 
      System.out.println("Is MyClass"); 
     } 
    } 

    public static MyInterface method(Class<? extends MyInterface> actualClass){ 
     try { 
      Class<?> enclosingClass = Class.forName(actualClass.getDeclaringClass().getCanonicalName()); 
      Object enclosingInstance = enclosingClass.newInstance(); 

      Class<?> innerClass = Class.forName(actualClass.getName()); 
      Constructor<?> constructor = innerClass.getDeclaredConstructor(enclosingClass); 

      Object innerInstance = constructor.newInstance(enclosingInstance); 
      return (MyInterface) innerInstance; 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null;  
    } 
} 
+0

Благодарим вас за исследование, но MyClass не является внутренним классом –

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