我一直在寻找一个问题:从其字符串名称实例化一个类,该字符串名称描述了如何在拥有名称时实例化一个类。有没有办法用Java做到这一点?我将拥有包名称和类名称,并且我需要能够创建具有该特定名称的对象。
我一直在寻找一个问题:从其字符串名称实例化一个类,该字符串名称描述了如何在拥有名称时实例化一个类。有没有办法用Java做到这一点?我将拥有包名称和类名称,并且我需要能够创建具有该特定名称的对象。
Answers:
两种方式:
如果您的类具有无参数构造函数,则可以Class
使用Class.forName()
并使用该newInstance()
方法创建一个实例(尽管请注意,此方法通常被认为是有害的,因为它可以击败Java的已检查异常),因此可以使用该对象。
例如:
Class<?> clazz = Class.forName("java.util.Date");
Object date = clazz.newInstance();
如果类没有任何无参数构造函数,另一种更安全的方法也可以使用,方法是查询您的类对象以获取其Constructor
对象并newInstance()
在该对象上调用方法:
Class<?> clazz = Class.forName("com.foo.MyClass");
Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
Object instance = constructor.newInstance("stringparam", 42);
两种方法都称为反射。通常,您必须捕获可能发生的各种异常,包括:
newInstance()
,是否可以将其投射回我们自己的对象?
instance
来com.foo.MyClass
?鉴于com.foo.MyClass只是一个字符串
MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();
使用Class.forName(“类别的字符串名称”).newInstance();
Class.forName("A").newInstance();
这将导致名为A的类被初始化。
为了更轻松地获取类的完全限定名称,以便使用创建实例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;
}
}
然后,您可以将对象转换为传递给的类 makeObject(...)
:
Data d = (Data) objectMaker.makeObject(Data.class);
clazz.newInstance()
代替getName
然后fromName
呢?
使用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);
}
}
}
它找到一个处理指定参数类型的构造函数并调用它,以创建该对象的新实例。这种方法的价值在于它是纯动态的,在执行时(而不是在编译时)进行构造函数查找和调用。
Class.forName(“ ClassName”)将解决您的目的。
Class class1 = Class.forName(ClassName);
Object object1 = class1.newInstance();
这样的事情应该工作...
String name = "Test2";//Name of the class
Class myClass = Class.forName(name);
Object o = myClass.newInstance();