2017-10-01 43 views
3

我试图使用Reflection来声明ArrayList。下面是我的代码NoSuchMethodException java.lang.Integer的参数在构造函数中传递(Reflection)

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) 

当我修改parameterslist作为

Class[] parameterslist={int.class} 

它的工作原理,但我必须考虑的参数类的名称从用户输入,所以我不能直接写int.class

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

+0

嗯,有一些原始类型。如果我是你,我会创建一个映射,并使用基本类型的名称作为键和相应的'Class'对象作为值。 – Sweeper

+0

@Sweeper你是对的。这将解决问题,但仍然为什么我们不能为此使用Class.forname? – Ahsan

+0

我不明白。您已将类名java.lang.Integer硬编码到此代码中。用户输入来自哪里?或'Class.forName()'?这里''Class.forName()'唯一的错误是你提供给它的参数。不清楚你在问什么。 – EJP

回答

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型检索构造函数,这一切。

+0

OP希望得到一些用户输入并获得与该输入对应的'Class'对象。所以如果用户输入'int',他想要得到'int.class' – Sweeper

+0

@Sweeper也许。从他的实际问题或他发布的代码中看不出来。这是由他来澄清,而不是我们猜测。 – EJP

+0

@Sweeper如果是这样,它真的不清楚。我最后回答到:“我只想知道为什么我们不能使用'Class.forName()'对象作为参数传递给'ArrayList'构造函数,并且当我编写'int.class'时它是如何工作的? “ – davidxxx

相关问题