2

我明白了

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)

当我运行这个时: package newinstancetest; 导入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 不应该打印对新对象的引用吗?知道为什么我会得到异常吗?

4

3 回答 3

2

该方法的返回类型是Integer没有no-arg构造函数的。要在 foo 方法中复制实例,您可以这样做

Object obj = method.getReturnType().getConstructor(int.class).newInstance(1);
于 2013-08-01T20:17:13.300 回答
2

整数没有没有参数的构造函数。您可以改用Integer(int),例如:

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

如果您打算调用该foo方法,那么您可以使用:

Object obj = method.invoke(null); //null for static
于 2013-08-01T20:18:51.913 回答
1

在运行时,方法getReturnType()

Object obj = method.getReturnType().newInstance();

返回一个Class<Integer>实例。该类Integer有两个构造函数,一个 withint和一个 with String

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

您需要获取构造函数

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

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

于 2013-08-01T20:17:44.003 回答