在构造函数中传递java.lang.Integer参数时的NoSuchMethodException(Reflection)

时间:2017-10-01 07:14:23

标签: java arraylist reflection

我正在尝试使用Reflection声明ArrayList。以下是我的代码

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {
    String intClass="java.lang.Integer";   //This string will be replaced by a string taken from user which will be a class name.
    Class classOf=Class.forName("java.util.ArrayList");
    Class[] parameterslist ={Class.forName(intClass)};
    Constructor constructorOfClass=classOf.getConstructor(parameterslist);
}

当我运行此代码时,我得到了

Exception in thread "main" java.lang.NoSuchMethodException: java.util.ArrayList.<init>(java.lang.Integer)

当我将参数列表修改为

Class[] parameterslist={int.class}

它有效但我必须将参数类的名称作为用户的输入,所以我不能直接写int.class

我已经搜索了Class.forName()Classname.class之间的区别,但像this这样的答案得出的结论是它们是相同的。 我只是想知道为什么我们不能使用Class.forName()对象作为参数传递给ArrayList构造函数,以及当我写int.class时它是如何工作的?如果Class.forName()不正确,那么我们如何才能将类名的对象作为用户的输入?

1 个答案:

答案 0 :(得分:5)

您要使用的ArrayList构造函数将原始int作为参数,而不是Integer类:

public ArrayList(int initialCapacity) 

您提供Integer类:

作为参数
String intClass="java.lang.Integer";
...
Class[] parameterslist ={Class.forName(intClass)};

这些不是反射用法的兼容类型。

  

如果Class.forname不是正确的方式,那么我们如何制作一个对象   作为用户输入的类名称。

Class.forName()不是问题所在。 如果要通过将特定类的实例作为构造函数的参数传递来通过反射创建对象,则该类必须提供具有此类型的构造函数。
对于ArrayList,您只有两个带参数的重载构造函数:

public ArrayList(Collection<? extends E> c) 

public ArrayList(int initialCapacity) 

因此,您可以通过反射检索具有Collection类型或int类型的构造函数,并且这些都是。