Ahs*_*san 4 java reflection arraylist
我试图宣布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);
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我得到了
Exception in thread "main" java.lang.NoSuchMethodException: java.util.ArrayList.<init>(java.lang.Integer)
Run Code Online (Sandbox Code Playgroud)
当我修改参数列表为
Class[] parameterslist={int.class}
Run Code Online (Sandbox Code Playgroud)
它的工作原理,但我必须将参数类的名称作为用户的输入,所以我不能直接写int.class.
我已经搜查约之间的区别Class.forName()和Classname.class但像回答这样认为,他们是一样的.我只是想知道为什么我们不能使用Class.forName()object作为参数传递给ArrayList构造函数,以及它在我编写时如何工作int.class?如果Class.forName()不是正确的方法,那么我们如何才能将类名的对象作为用户的输入?
ArrayList您要使用的构造函数将基元作为参数int而不是Integer类:
public ArrayList(int initialCapacity)
Run Code Online (Sandbox Code Playgroud)
您提供Integer类作为参数:
String intClass="java.lang.Integer";
...
Class[] parameterslist ={Class.forName(intClass)};
Run Code Online (Sandbox Code Playgroud)
这些不是反射使用的兼容类型.
如果Class.forname不是正确的方法,那么我们如何将类名的对象作为用户的输入.
Class.forName()这不是问题.如果要通过将特定类的实例作为构造函数的参数传递来通过反射创建对象,则该类必须提供具有此类型的构造函数.
对于ArrayList,您只有两个带参数的重载构造函数:
public ArrayList(Collection<? extends E> c)
Run Code Online (Sandbox Code Playgroud)
和
public ArrayList(int initialCapacity)
Run Code Online (Sandbox Code Playgroud)
因此,您可以通过反射检索具有Collection类型或int类型的构造函数,这就是全部.