Java Class.newInstance()中的tmpConstructor为空

时间:2014-10-01 16:09:36

标签: java java-ee constructor

我已经将错误追踪到java.lang.Class类的第362行:

Constructor<T> tmpConstructor = cachedConstructor;

似乎没有分配变量。在调试表达式窗口中,它只说“tmpConstructor无法解析为变量”。 cachedConstructor不为null。

只有在调用newInstance()函数时才会进一步抛出错误:

try {
       return tmpConstructor.newInstance((Object[])null);
    } catch (InvocationTargetException e) {                      
       Unsafe.getUnsafe().throwException(e.getTargetException());
        // Not reached
        return null;
    }

上下文: 使用带有Struts2框架的JSON插件从收到的JSON创建Java对象。 它试图解析的字段是抽象类的子类。

在进一步检查时(感谢user902838)我错过了它无法实例化抽象类。所以我需要找出它如何实例化子类,这是一个不同的问题。

有人可以向我解释为什么tmpconstructor是空的吗?

1 个答案:

答案 0 :(得分:0)

如果没有关于您尝试实例化的类或您观察到的异常/错误的任何信息,很难说,但我最好的猜测是该类没有一个无效的构造函数。该程序存在这样的问题:

package example;

public class NewInstanceTest {

    public NewInstanceTest(String s) {
    }

    public static void main(String[] args) throws Exception {
        Class.forName("example.NewInstanceTest").newInstance();
    }

}

可以通过添加一个无效的构造函数来解决问题:

package example;

public class NewInstanceTest {

    /* nullary constructor: */
    public NewInstanceTest() {
        this("default");
    }

    public NewInstanceTest(String s) {
    }

    public static void main(String[] args) throws Exception {
        Class.forName("example.NewInstanceTest").newInstance();
    }

}

或删除所有非空构造函数,以便Java自动提供一个nullary:

package example;

public class NewInstanceTest {

    public static void main(String[] args) throws Exception {
        Class.forName("example.NewInstanceTest").newInstance();
    }

}