调用method.getReturnType()时的InstantiationException.newInstance(),一个静态内部类的静态方法

时间:2013-08-01 20:11:20

标签: java object static-methods inner-classes

我得到了

run: method: foo
Return type: class java.lang.Integer
Exception in thread "main" java.lang.InstantiationException: java.lang.Integer
  at java.lang.Class.newInstance0(Class.java:359)
  at java.lang.Class.newInstance(Class.java:327)
  at newinstancetest.NewInstanceTest.main(NewInstanceTest.java:10)
Java Result: 1 BUILD SUCCESSFUL (total time: 0 seconds)

当我运行时: 包newinstancetest; import java.lang.reflect.Method;

public class NewInstanceTest {

public static void main(String[] args) throws NoSuchMethodException, InstantiationException, IllegalAccessException {
    Method method = InnerClass.class.getDeclaredMethod("foo", null);
    System.out.println("method: " + method.getName());
    System.out.println("Return type: " + method.getReturnType());
    Object obj = method.getReturnType().newInstance();
    System.out.println("obj: " + obj);
}

public static class InnerClass {
    public static Integer foo() {
        return new Integer(1);
    }
}
}

不应该" obj" + obj打印对新对象的引用?知道为什么我会得到一个例外吗?

3 个答案:

答案 0 :(得分:2)

方法的返回类型是Integer,它没有no-arg构造函数。要在foo方法中复制实例,可以执行

Object obj = method.getReturnType().getConstructor(int.class).newInstance(1);

答案 1 :(得分:2)

Integer没有没有参数的构造函数。您可以使用Integer(int)代替:

Object obj = method.getReturnType().getConstructor(int.class).newInstance(0);

如果您打算调用foo方法,则可以使用:

Object obj = method.invoke(null); //null for static

答案 2 :(得分:1)

在运行时,

中的方法getReturnType()
Object obj = method.getReturnType().newInstance();

返回Class<Integer>个实例。 Integer类有两个构造函数,一个使用int,另一个使用String

当你调用newInstance()时,你期望返回的类对象的默认no-arg构造函数,它不存在。

你需要获得构造函数

Constructor[] constructors = d.getReturnType().getConstructors();

然后迭代并使用匹配最佳的那个。