2014-01-21 89 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的」裏面的OWN類文件其做工精細,只需提供

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不是內部課程 –