有没有一种方法可以在Java中按名称实例化类?
我想问的问题是:它描述了当类有名称时如何实例化类。有没有一种用Java实现的方法?我将拥有包名和类名,并且我需要能够创建具有该特定名称的对象。使用class.forName(“类的字符串名”).newInstance()强>有没有一种方法可以在Java中按名称实例化类?,java,string,object,instantiation,Java,String,Object,Instantiation,我想问的问题是:它描述了当类有名称时如何实例化类。有没有一种用Java实现的方法?我将拥有包名和类名,并且我需要能够创建具有该特定名称的对象。使用class.forName(“类的字符串名”).newInstance() Class.forName("A").newInstance(); 这将导致名为A的类被初始化。有两种方式: MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance(); 方法1-仅适用于具有无
Class.forName("A").newInstance();
这将导致名为A的类被初始化。有两种方式:
MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();
方法1-仅适用于具有无参数构造函数的类
如果您的类具有无参数构造函数,则可以使用class.forName()
获取class
对象,并使用newInstance()
方法创建实例(但请注意,此方法通常是因为它可以击败Java的检查异常)
例如:
Class<?> clazz = Class.forName("java.util.Date");
Object date = clazz.newInstance();
这两种方法都称为。您通常必须捕获可能发生的各种异常,包括:
- JVM找不到或无法加载您的类
- 您试图实例化的类没有正确类型的构造函数
- 构造函数本身抛出了一个异常
- 您试图调用的构造函数不是公共的
- 已安装安全管理器,正在防止发生反射
- 像这样的东西应该可以
String name = "Test2";//Name of the class
Class myClass = Class.forName(name);
Object o = myClass.newInstance();
使用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 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;
}
}
从Java8开始,直接使用
newInstance()
是不推荐的。您需要使用Class.getDeclaredConstructor(…).newInstance(…)
和相应的异常。值得一提的是,如果类没有无参数构造函数(并且有其他构造函数),或者如果无参数构造函数不可访问,则此方法不起作用。我们实例化一个类,结果是一个对象(或:举例)。答案是肯定的,但我认为你应该问这是不是一个好主意。强大的力量(反思)带来巨大的责任,只有在你理解并考虑了后果后,你才应该使用它。对我来说,这不管用,即使包名已经预先准备好了(@Simon你能详细说明/给出关于安全管理器的指针吗?你不能简单地clazz.newInstance()
而不是getName
然后fromName
?
Class class1 = Class.forName(ClassName);
Object object1 = class1.newInstance();
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;
}
}
Data d = (Data) objectMaker.makeObject(Data.class);