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 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);
9条答案
按热度按时间7vhp5slm1#
forname(“classname”)将解决您的问题。
vbopmzt12#
像这样的事情应该管用。。。
whhtz7ly3#
两种方式:
方法1-仅适用于没有参数构造函数的类
如果你的类有一个无参数构造函数,你可以得到一个
Class
对象使用Class.forName()
使用newInstance()
方法来创建一个示例(不过要注意,这个方法通常被认为是邪恶的,因为它可以击败java的检查异常)。例如:
方法2
如果类没有任何no-arg构造函数,另一种更安全的方法是查询类对象以获取其
Constructor
对象并调用newInstance()
此对象上的方法:这两种方法都称为反射。通常,您必须捕获可能发生的各种异常,包括:
jvm找不到或无法加载您的类
您尝试示例化的类没有正确的构造函数类型
构造函数本身引发了一个异常
您尝试调用的构造函数不是公共的
已安装安全管理器,正在阻止发生反射
ztigrdn84#
使用class.forname(“类的字符串名称”).newinstance();
这将导致名为a的类被初始化。
x33g5p2x5#
iyfamqjs6#
使用
newInstance()
从Java8开始就不赞成直接使用。你需要使用Class.getDeclaredConstructor(...).newInstance(...)
但也有相应的例外。mf98qq947#
使用java反射
创建新对象对于构造函数来说没有方法调用的等价性,因为调用构造函数等同于创建一个新对象(最准确地说,创建一个新对象涉及内存分配和对象构造)。因此,与上一个例子最接近的等价物是:
它找到一个处理指定参数类型的构造函数并调用它,以创建对象的新示例。这种方法的价值在于它是纯动态的,在执行时进行构造函数查找和调用,而不是在编译时。
hgncfbus8#
rggaifut9#
更容易获得类的完全限定名,以便使用
Class.forName(...)
,可以使用Class.getName()
方法。比如:然后你可以将你得到的对象投射回你传递给的任何类
makeObject(...)
: