【问题标题】:Class newInstance() with Constructor类 newInstance() 与构造函数
【发布时间】:2013-07-04 01:05:40
【问题描述】:

以下代码返回 null:

    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,我该如何解决?

【问题讨论】:

  • java.lang.NoSuchMethodException: javax.swing.JTextField.&lt;init&gt;(javax.swing.JTextField)
  • 永远不要留下空白的catch 声明。至少在e.printStackTrace() 上加上一条评论,说永远不应该调用该块。这样,当您遇到意外行为(例如被抛出而您忽略的异常)时,您可以找出原因。

标签: java class constructor null


【解决方案1】:

你需要使用类的静态版本。

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

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

        return null;
    }
【解决方案2】:

它返回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;
}

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    相关资源
    最近更新 更多