Creating an instance using the class name and calling constructor

JavaReflectionInstantiation

Java Problem Overview


Is there a way to create an instance of a particular class given the class name (dynamic) and pass parameters to its constructor.

Something like:

Object object = createInstance("mypackage.MyClass","MyAttributeValue");

Where "MyAttributeValue" is an argument to the constructor of MyClass.

Java Solutions


Solution 1 - Java

Yes, something like:

Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });

That will only work for a single string parameter of course, but you can modify it pretty easily.

Note that the class name has to be a fully-qualified one, i.e. including the namespace. For nested classes, you need to use a dollar (as that's what the compiler uses). For example:

package foo;

public class Outer
{
    public static class Nested {}
}

To obtain the Class object for that, you'd need Class.forName("foo.Outer$Nested").

Solution 2 - Java

You can use Class.forName() to get a Class object of the desired class.

Then use getConstructor() to find the desired Constructor object.

Finally, call newInstance() on that object to get your new instance.

Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> cons = c.getConstructor(String.class);
Object object = cons.newInstance("MyAttributeValue");

Solution 3 - Java

You can use reflections

return Class.forName(className).getConstructor(String.class).newInstance(arg);

Solution 4 - Java

If class has only one empty constructor (like Activity or Fragment etc, android classes):

Class<?> myClass = Class.forName("com.example.MyClass");    
Constructor<?> constructor = myClass.getConstructors()[0];

Solution 5 - Java

when using (i.e.) getConstructor(String.lang) the constructor has to be declared public. Otherwise a NoSuchMethodException is thrown.

if you want to access a non-public constructor you have to use instead (i.e.) getDeclaredConstructor(String.lang).

Solution 6 - Java

Solution 7 - Java

Very Simple way to create an object in Java using Class<?> with constructor argument(s) passing:

Case 1:- Here, is a small code in this Main class:

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Main {

	public static void main(String args[]) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		
		// Get class name as string.
		String myClassName = Base.class.getName();
		// Create class of type Base.
		Class<?> myClass = Class.forName(myClassName);
		// Create constructor call with argument types.
		Constructor<?> ctr = myClass.getConstructor(String.class);
		// Finally create object of type Base and pass data to constructor.
		String arg1 = "My User Data";
		Object object = ctr.newInstance(new Object[] { arg1 });
		// Type-cast and access the data from class Base.
		Base base = (Base)object;
		System.out.println(base.data);
    }
	
}

And, here is the Base class structure:

public class Base {

	public String data = null;
	
	public Base() 
	{
		data = "default";
		System.out.println("Base()");
	}
	
	public Base(String arg1) {
		data = arg1;
		System.out.println("Base("+arg1+")");
	}
	
}

Case 2:- You, can code similarly for constructor with multiple argument and copy constructor. For example, passing 3 arguments as parameter to the Base constructor will need the constructor to be created in class and a code change in above as:

Constructor<?> ctr = myClass.getConstructor(String.class, String.class, String.class);
Object object = ctr.newInstance(new Object[] { "Arg1", "Arg2", "Arg3" }); 

And here the Base class should somehow look like:

public class Base {
	
	public Base(String a, String b, String c){
		// This constructor need to be created in this case.
	}	
}

Note:- Don't forget to handle the various exceptions which need to be handled in the code.

Solution 8 - Java

Another helpful answer. How do I use getConstructor(params).newInstance(args)?

return Class.forName(**complete classname**)
    .getConstructor(**here pass parameters passed in constructor**)
    .newInstance(**here pass arguments**);

In my case, my class's constructor takes Webdriver as parameter, so used below code:

return Class.forName("com.page.BillablePage")
    .getConstructor(WebDriver.class)
    .newInstance(this.driver);

Solution 9 - Java

If anyone is looking for a way to create an instance of a class despite the class following the Singleton Pattern, here is a way to do it.

// Get Class instance
Class<?> clazz = Class.forName("myPackage.MyClass");

// Get the private constructor.
Constructor<?> cons = clazz.getDeclaredConstructor();

// Since it is private, make it accessible.
cons.setAccessible(true);

// Create new object. 
Object obj = cons.newInstance();

This only works for classes that implement singleton pattern using a private constructor.

Solution 10 - Java

You can also invoke methods inside the created object.

You can create object instant by invoking the first constractor and then invoke the first method in the created object.

    Class<?> c = Class.forName("mypackage.MyClass");
    Constructor<?> ctor = c.getConstructors()[0];
    Object object=ctor.newInstance(new Object[]{"ContstractorArgs"});
	c.getDeclaredMethods()[0].invoke(object,Object... MethodArgs);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTheLameProgrammerView Question on Stackoverflow
Solution 1 - JavaJon SkeetView Answer on Stackoverflow
Solution 2 - JavaJoachim SauerView Answer on Stackoverflow
Solution 3 - JavaPeter LawreyView Answer on Stackoverflow
Solution 4 - Javatier777View Answer on Stackoverflow
Solution 5 - JavamatthiasboesingerView Answer on Stackoverflow
Solution 6 - JavaAlan EscreetView Answer on Stackoverflow
Solution 7 - JavaRahul RainaView Answer on Stackoverflow
Solution 8 - Javauser3181500View Answer on Stackoverflow
Solution 9 - JavaOmerView Answer on Stackoverflow
Solution 10 - JavaHatem BadawiView Answer on Stackoverflow