我想将一个类类型作为参数传递给java中的一个方法。所有这些都具有相同的构造函数参数。并在该方法中创建该类的一个实例。这可能吗?
几年后更新:请查看 Sapnesh Naik 对此的回答,这似乎是最新的。我没有接受作为答案,因为我没有正在运行的 java 堆栈。
PS:如果您可以验证,请给我大喊。
使用反射创建实例:
Object obj = clazz.newInstance();
这将使用默认的无参数构造函数来创建实例。
Constructor<?> constructor = clazz.getConstructor(String.class);
Object object = constructor.newInstance(new Object[] { strArgument });
如果您有其他带有参数的构造函数,则创建实例。
您需要使用反射来做到这一点,但是是的,这当然是可能的。
void MyMethod(Class className)
{
try {
Object obj = className.newInstance();
//obj is a newly created object of the passed in type
}
catch (Exception ex) { }
}
newInstance()
已弃用。此方法传播由 nullary 构造函数引发的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译器执行的编译时异常检查。Constructor.newInstance 方法通过将构造函数抛出的任何异常包装在(已检查的)java.lang.reflect.InvocationTargetException 中来避免此问题。
不推荐使用的调用:
clazz.newInstance()
可以替换为:
clazz.getDeclaredConstructor().newInstance()
例子:
void MyMethod(Class type) throws InstantiationException, IllegalAccessException {
type.getDeclaredConstructor().newInstance();
}
您正在寻找反射。
你的方法看起来像这样:
public void m1(Class c) {
try {
Object obj = c.newInstance();
//do something with your new instance
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
}
}
反射 API 的 Oracle 文档在这里
是的你可以
void x(Class cls) throws InstantiationException, IllegalAccessException {
cls.newInstance();
}
请注意, Class.newInstance 可能会失败
IllegalAccessException - 如果类或其空构造函数不可访问。
InstantiationException - 如果这个 Class 表示抽象类、接口、数组类、原始类型或 void;或者如果该类没有空构造函数;或者如果实例化由于某种其他原因而失败。
有关更多信息,请参阅 API