Is there a way to instantiate a class by name in Java?

JavaStringObjectInstantiation

Java Problem Overview


I was looking as the question : Instantiate a class from its string name which describes how to instantiate a class when having its name. Is there a way to do it in Java? I will have the package name and class name and I need to be able to create an object having that particular name.

Java Solutions


Solution 1 - Java

Two ways:

Method 1 - only for classes having a no-arg constructor

If your class has a no-arg constructor, you can get a Class object using Class.forName() and use the newInstance() method to create an instance (though beware that this method is often https://stackoverflow.com/questions/195321/why-is-class-newinstance-evil">considered evil because it can defeat Java's checked exceptions).

For example:

Class<?> clazz = Class.forName("java.util.Date");
Object date = clazz.newInstance();

Method 2

An alternative safer approach which also works if the class doesn't have any no-arg constructors is to query your class object to get its Constructor object and call a newInstance() method on this object:

Class<?> clazz = Class.forName("com.foo.MyClass");
Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
Object instance = constructor.newInstance("stringparam", 42);

Both methods are known as http://en.wikipedia.org/wiki/Reflection_(computer_programming)">reflection</a>;. You will typically have to catch the various exceptions which can occur, including things like:

  • the JVM can't find or can't load your class
  • the class you're trying to instantiate doesn't have the right sort of constructors
  • the constructor itself threw an exception
  • the constructor you're trying to invoke isn't public
  • a security manager has been installed and is preventing reflection from occurring

Solution 2 - Java

MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();

Solution 3 - Java

Using newInstance() directly is deprecated as of Java 8. You need to use Class.getDeclaredConstructor(...).newInstance(...) with the corresponding exceptions.

Solution 4 - Java

To make it easier to get the fully qualified name of a class in order to create an instance using Class.forName(...), one could use the Class.getName() method. Something like:

class ObjectMaker {
    // Constructor, fields, initialization, etc...
    public Object makeObject(Class<?> clazz) {
        Object o = null;

	    try {
	        o = Class.forName(clazz.getName()).newInstance();
        } catch (ClassNotFoundException e) {
            // There may be other exceptions to throw here, 
            // but I'm writing this from memory.
            e.printStackTrace();
        }

        return o;
    }
}

Then you can cast the object you get back to whatever class you pass to makeObject(...):

Data d = (Data) objectMaker.makeObject(Data.class);

Solution 5 - Java

use Class.forName("String name of class").newInstance();

Class.forName("A").newInstance();

This will cause class named A initialized.

Solution 6 - Java

Use java reflection

Creating New Objects There is no equivalent to method invocation for constructors, because invoking a constructor is equivalent to creating a new object (to be the most precise, creating a new object involves both memory allocation and object construction). So the nearest equivalent to the previous example is to say:

import java.lang.reflect.*;
        
   public class constructor2 {
      public constructor2()
      {
      }
        
      public constructor2(int a, int b)
      {
         System.out.println(
           "a = " + a + " b = " + b);
      }
        
      public static void main(String args[])
      {
         try {
           Class cls = Class.forName("constructor2");
           Class partypes[] = new Class[2];
            partypes[0] = Integer.TYPE;
            partypes[1] = Integer.TYPE;
            Constructor ct 
              = cls.getConstructor(partypes);
            Object arglist[] = new Object[2];
            arglist[0] = new Integer(37);
            arglist[1] = new Integer(47);
            Object retobj = ct.newInstance(arglist);
         }
         catch (Throwable e) {
            System.err.println(e);
         }
      }
   }

which finds a constructor that handles the specified parameter types and invokes it, to create a new instance of the object. The value of this approach is that it's purely dynamic, with constructor lookup and invocation at execution time, rather than at compilation time.

Solution 7 - Java

Class.forName("ClassName") will solve your purpose.

Class class1 = Class.forName(ClassName);
Object object1 = class1.newInstance();

Solution 8 - Java

String str = (String)Class.forName("java.lang.String").newInstance();

Solution 9 - Java

something like this should work...

String name = "Test2";//Name of the class
		Class myClass = Class.forName(name);
		Object o = myClass.newInstance();

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
Questionict1991View Question on Stackoverflow
Solution 1 - JavaSimon NickersonView Answer on Stackoverflow
Solution 2 - JavascibuffView Answer on Stackoverflow
Solution 3 - JavaCarrolView Answer on Stackoverflow
Solution 4 - JavaRobertoView Answer on Stackoverflow
Solution 5 - JavaChandra SekharView Answer on Stackoverflow
Solution 6 - JavakorneroView Answer on Stackoverflow
Solution 7 - JavaBalaswamy VaddemanView Answer on Stackoverflow
Solution 8 - JavaChen HarelView Answer on Stackoverflow
Solution 9 - JavaShashank KadneView Answer on Stackoverflow