2012-08-23 48 views
1

在下面的代碼,我得到java.lang.InstantiationException的Java Class.newInstance錯誤

(下面是下調,編譯獨立代碼 - 在我的應用我想保持Enum->類映射,以及在讀取文件中的整數值時,實例化適當的類來查看地圖)。

如何擺脫錯誤?是否有語法問題?我必須使用接口嗎?我在這裏的理解是有限的。

class Main { 
    abstract class Base { 
     Base() {}; 
     void print() { 
      System.out.println("I am in Base"); 
     } 
    } 


    class D1 extends Base { 
     D1() {}; 
     @Override 
     void print() { 
      System.out.println("I am in D1"); 
     } 
    } 

    static Class<? extends Base> getMyClass() { 
     return D1.class; 
    } 


    public static void main(String[] args) { 
     try { 
      Class<?> cc = getMyClass(); 
      Object oo = cc.newInstance(); 
      Base bb = (Base) oo; 
      bb.print(); 

     } catch (Exception ee) { 
      System.out.println(ee); 
     }; 
    } 
}; 
+0

燦你給你的例外堆棧跟蹤? – tom

+0

在eclipse控制檯中,我只能看到這一行:'java.lang.InstantiationException:mypackage.Main $ D1' – workwise

+1

嘗試'ee.printStackTrace();' – tom

回答

5

您的代碼有兩個問題:

  • BaseD1都是非靜態內部類。這意味着他們可以訪問其聲明類(Main)的字段和方法,因此他們應該參考Main的實例。因此,它們的構造函數有一個類型爲Main的隱含參數,用於傳遞該引用。所以,他們沒有無參數的構造函數,你應該使用單參數的構造函數來代替:

    Object oo = cc.getConstructor(Main.class).newInstance(new Main()); 
    

    或者,你可以簡單地聲明爲static,或者宣佈的Main之外 - 在這種情況下,他們將無法訪問Main的成員,並且不需要提及它。

  • 構造函數D1應該是public。否則,您需要致電setAccessible(true)以使其可以進行反思。

+0

太棒了!宣佈他們在外面工作! – workwise

0

由於兩個類BaseD1是內部類與同一時間,他們都是非靜態內部類,所以他們的方法可以通過創建對象主類,你可以調用他們的主要構造函數中的方法內的內部類可以訪問它會是這個樣子..

class Main { 
     Main(){  
     D1 dd = new D1(); 
     } 
     abstract class Base { 
      Base() {}; 
      void print() { 
       System.out.println("I am in Base"); 
      } 
     } 
    class D1 extends Base { 
      D1() {}; 
      @Override 
      void print() { 
       System.out.println("I am in D1"); 
      } 
    } 

}

希望這將幫助你..謝謝