Ahsan Ahsan - 3 years ago 194
Java Question

NoSuchMethodException when parameter of java.lang.Integer is passed in constructor (Reflection)

I am trying to declare an

using Reflection. Below is my code

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);

When I run this code I get

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

When I modify parameterslist as

Class[] parameterslist={int.class}

it works but I have to take the name of parameter class as input from a user, so I can't directly write

I have already searched about the difference between
but answers like this conclude that they are same.
I just want to know why we cannot use
object to pass as a parameter to
constructor and how does it work when I write
? If
is not the right way then how can we make an object of a classname taken as input from a user?

Answer Source

The ArrayList constructor that you want to use takes as parameter a primitive int and not an Integer class :

public ArrayList(int initialCapacity) 

You provide as argument the Integer class :

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

These are not compatible types for reflection usage.

If Class.forname is not the right way than how can we make an object of a classname taken as input from user.

Class.forName() is not the issue here. If you want to create by reflection an object by passing an instance of a specific class as argument of the constructor, the class has to provide a constructor with this type.
For ArrayList, you have only two overloaded constructors with arguments :

public ArrayList(Collection<? extends E> c) 


public ArrayList(int initialCapacity) 

So you could retrieve by reflection a constructor with a Collection type or an int type and that's all.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download