2013-07-04 70 views
1

下面的代碼返回null:類的newInstance()與構造

private JComponent setupComponent(Class<? extends JComponent> c, Object... constructor) { 

     try { 
      return c.getConstructor(new Class[] { c.getClass() }).newInstance(constructor); 
     } 
     catch (Exception e) { } 

     return null; 
    } 

我在這裏稱之爲:

JTextField userText = (JTextField) setupComponent(JTextField.class, "Test"); 

爲什麼返回null,我該如何解決?

+0

'java.lang.NoSuchMethodException:javax.swing.JTextField中。 (javax.swing.JTextField)' – JHS

+1

永遠不要留下空白的catch語句。至少把'e.printStackTrace()'放在一個註釋中,說該塊不應該被調用。通過這種方式,當你遇到意外的行爲時(比如拋出的異常和你忽略的異常),你可以找出原因。 – Jeffrey

回答

0

您需要使用類的靜態版本。

private JComponent setupComponent(Class<? extends JComponent> c, Object... constructor) { 

     try { 
      return c.getConstructor(new Class[] { c}).newInstance(constructor); 
     } 
     catch (Exception e) { } 

     return null; 
    } 
+0

爲什麼'c.getClass()'不工作? –

+1

http://stackoverflow.com/questions/10947768/difference-between-a-getclass-and-a-class –

+0

@Jeffrey好的,謝謝。 –

0

它返回null,因爲它在異常塊中靜默失敗。顯示堆棧跟蹤以顯示異常的來源。

的主要問題是,你需要使用匹配類類型參數這對應於傳遞,而不是具體JComponent本身的類型構造函數的參數來定位正確的構造函數。即JTextField(String)

private JComponent setupComponent 
       (Class<? extends JComponent> c, Object... constructor) { 

    // build matching class args  
    Class<?>[] classArgs = new Class[constructor.length]; 
    for (int i = 0; i < constructor.length; i++) { 
     classArgs[i] = constructor[i].getClass(); 
    } 

    try { 
     return c.getConstructor(classArgs).newInstance(constructor); 
    } catch (Exception e) { 
     e.printStackTrace(); // add this 
    } 

    return null; 
}