问题
我正在寻找一个问题:Instantiate an class from its string name,它描述了如何在拥有名称时实例化一个类。有没有办法在Java中做到这一点?我将拥有包名和类名,我需要能够创建具有该特定名称的对象。
#1 热门回答(194 赞)
两种方式:
##方法1 - 仅适用于具有无参数构造函数的类
如果你的类有一个no-arg构造函数,你可以使用Class.forName()获得aClassobject并使用newInstance()方法创建一个实例(但要注意这个方法通常是considered evil,因为它可以击败Java的已检查异常)。
例如:
Class> clazz = Class.forName("java.util.Date");
Object date = clazz.newInstance();
##方法2
如果类没有任何no-arg构造函数,那么另一种更安全的方法也可以查询你的类对象以获取它的Constructorobject并在这个对象上调用anewInstance()方法:
Class> clazz = Class.forName("com.foo.MyClass");
Constructor> constructor = clazz.getConstructor(String.class, Integer.class);
Object instance = constructor.newInstance("stringparam", 42);
这两种方法都称为reflection。你通常必须捕获可能发生的各种异常,包括以下内容:
JVM无法找到或无法加载你的类
你尝试实例化的类没有正确的构造函数
构造函数本身引发了异常
你尝试调用的构造函数不是公共的
已安装安全管理器并阻止反射发生
#2 热门回答(12 赞)
MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();
#3 热门回答(3 赞)
useClass.forName("类名称的字符串")。newInstance();
Class.forName("A").newInstance();
这将导致名为A的类初始化。