我想将类类型作为参数传递给java.all中具有相同构造函数参数的方法。并在该方法中创建该类的实例。这可能吗?
答案 0 :(得分:16)
使用反射创建实例:
Object obj = clazz.newInstance();
这将使用默认的 no-arg 构造函数来创建实例。
Constructor<?> constructor = clazz.getConstructor(String.class);
Object object = constructor.newInstance(new Object[] { strArgument });
如果你有一些其他带参数的构造函数,那么创建实例。
答案 1 :(得分:3)
你需要使用反射来做到这一点,但是它肯定是可能的。
void MyMethod(Class className)
{
try {
Object obj = className.newInstance();
//obj is a newly created object of the passed in type
}
catch (Exception ex) { }
}
答案 2 :(得分:2)
你正在寻找反思。
你的方法看起来像这样:
public void m1(Class c) {
try {
Object obj = c.newInstance();
//do something with your new instance
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
}
}
Reflection API的Oracle文档是here
答案 3 :(得分:1)
是的,你可以
void x(Class cls) throws InstantiationException, IllegalAccessException {
cls.newInstance();
}
请注意,Class.newInstance可能会失败并显示
IllegalAccessException - 如果无法访问该类或其无效构造函数。
InstantiationException - 如果此Class表示抽象类,接口,数组类,基元类型或void;或者如果该类没有无效的构造函数;或者如果实例化由于其他原因而失败。
请参阅API获取更多信息
答案 4 :(得分:1)
clazz.newInstance()
已过时。此方法传播由空值引发的任何异常 构造函数,包括一个检查的异常。使用这种方法 有效地绕过了编译时异常检查 否则由编译器执行。 Constructor.newInstance 方法通过包装由抛出的任何异常来避免此问题 构造函数(选中) java.lang.reflect.InvocationTargetException。
通话:
clazz.newInstance()
可以替换为:
clazz.getDeclaredConstructor().newInstance()
示例:
void MyMethod(Class type) throws InstantiationException, IllegalAccessException {
type.getDeclaredConstructor().newInstance();
}