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

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.

149496 次浏览

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

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

这将导致名为 A 的类初始化。

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

两种方式:

方法1-只适用于具有无参数构造函数的类

如果您的类有一个 no-arg 构造函数,那么您可以使用 Class.forName()获得一个 Class对象,并使用 newInstance()方法来创建一个实例(不过要注意,这个方法通常是 被认为是邪恶的,因为它可以破坏 Java 的检查异常)。

例如:

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

方法2

如果类没有任何 no-arg 构造函数,另一种更安全的方法是查询类对象以获得它的 Constructor对象,并在这个对象上调用一个 newInstance()方法:

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

这两种方法都称为 反思。您通常必须捕获可能发生的各种异常,包括:

  • JVM 找不到或者无法加载您的类
  • the class you're trying to instantiate doesn't have the right sort of constructors
  • 构造函数本身抛出了一个异常
  • 您试图调用的构造函数不是公共的
  • 已经安装了安全管理器,正在防止发生反射

像这样的东西应该可以..。

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

使用爪哇反射

创建新对象 没有等价于构造函数的方法调用,因为调用构造函数等价于创建一个新对象(更准确地说,创建一个新对象涉及内存分配和对象构造)。因此,与前面的例子最接近的等价物是:

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

它找到处理指定参数类型的构造函数并调用它,以创建对象的新实例。这种方法的价值在于它是纯动态的,在执行时而不是在编译时进行构造函数查找和调用。

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

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

为了更容易获得类的完全限定名,以便使用 Class.forName(...)创建实例,可以使用 Class.getName()方法。比如:

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

从 Java8开始就不推荐直接使用 newInstance()。您需要使用带有相应异常的 Class.getDeclaredConstructor(...).newInstance(...)