string - 有没有办法在Java中按名称实例化一个类?
我的问题是:从其字符串名称实例化一个类,该名称描述了如何在拥有名称时实例化一个类。 有没有办法在Java中做到这一点? 我将拥有包名和类名,我需要能够创建具有该特定名称的对象。
8个解决方案
200 votes
两种方式:
方法1 - 仅适用于具有无参数构造函数的类
如果您的类具有无参数构造函数,则可以使用Class.forName()获取Class对象并使用Constructor方法创建实例(但要注意此方法通常被认为是邪恶的,因为它可以破坏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无法找到或无法加载您的类
您尝试实例化的类没有正确的构造函数
构造函数本身引发了异常
您尝试调用的构造函数不是公共的
已安装安全管理器并阻止反射发生
Simon Nickerson answered 2019-04-18T02:33:56Z
13 votes
MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();
scibuff answered 2019-04-18T02:34:15Z
3 votes
使用Class.forName(“类的字符串名称”)。newInstance();
Class.forName("A").newInstance();
这将导致名为A的类初始化。
Chandra Sekhar answered 2019-04-18T02:34:47Z
2 votes
为了更容易获得类的完全限定名称以便使用makeObject(...)创建实例,可以使用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;
}
}
然后你可以将你得到的对象转换为你传递给makeObject(...)的任何类:
Data d = (Data) objectMaker.makeObject(Data.class);
Roberto answered 2019-04-18T02:35:21Z
1 votes
使用java反射
创建新对象没有与构造函数的方法调用等效,因为调用构造函数等同于创建新对象(最精确的是,创建新对象涉及内存分配和对象构造)。 所以与上一个例子最接近的等价是:
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);
}
}
}
它找到一个处理指定参数类型并调用它的构造函数,以创建该对象的新实例。 这种方法的价值在于它纯粹是动态的,在执行时使用构造函数查找和调用,而不是在编译时。
kornero answered 2019-04-18T02:36:02Z
1 votes
Class.forName(“ClassName”)将解决您的目的。
Class class1 = Class.forName(ClassName);
Object object1 = class1.newInstance();
Balaswamy Vaddeman answered 2019-04-18T02:36:28Z
0 votes
String str = (String)Class.forName("java.lang.String").newInstance();
Chen Harel answered 2019-04-18T02:36:47Z
0 votes
这样的事情应该有效......
String name = "Test2";//Name of the class
Class myClass = Class.forName(name);
Object o = myClass.newInstance();
Shashank Kadne answered 2019-04-18T02:37:13Z