20

我想将一个类类型作为参数传递给java中的一个方法。所有这些都具有相同的构造函数参数。并在该方法中创建该类的一个实例。这可能吗?

几年后更新:请查看 Sapnesh Naik 对此的回答,这似乎是最新的。我没有接受作为答案,因为我没有正在运行的 java 堆栈。
PS:如果您可以验证,请给我大喊。

4

5 回答 5

18

使用反射创建实例:

Object obj = clazz.newInstance();

这将使用默认的无参数构造函数来创建实例。

Constructor<?> constructor = clazz.getConstructor(String.class);
Object object = constructor.newInstance(new Object[] { strArgument });

如果您有其他带有参数的构造函数,则创建实例。

于 2013-04-11T06:23:43.230 回答
4

您需要使用反射来做到这一点,但是是的,这当然是可能的。

void MyMethod(Class className)
{
    try {
        Object obj = className.newInstance();
        //obj is a newly created object of the passed in type
    }
    catch (Exception ex) { }
}
于 2013-04-11T06:21:57.240 回答
4

newInstance()已弃用。

此方法传播由 nullary 构造函数引发的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译器执行的编译时异常检查。Constructor.newInstance 方法通过将构造函数抛出的任何异常包装在(已检查的)java.lang.reflect.InvocationTargetException 中来避免此问题。

不推荐使用的调用:

clazz.newInstance()

可以替换为:

clazz.getDeclaredConstructor().newInstance()

例子:

void MyMethod(Class type) throws InstantiationException, IllegalAccessException {
    type.getDeclaredConstructor().newInstance();
}
于 2019-06-25T05:12:17.107 回答
3

您正在寻找反射。

你的方法看起来像这样:

public void m1(Class c) {

      try {
        Object obj = c.newInstance();
        //do something with your new instance
    } catch (InstantiationException ex) {

    } catch (IllegalAccessException ex) {

    }
}

反射 API 的 Oracle 文档在这里

于 2013-04-11T06:23:14.200 回答
1

是的你可以

void x(Class cls) throws InstantiationException, IllegalAccessException {
    cls.newInstance();
}

请注意, Class.newInstance 可能会失败

IllegalAccessException - 如果类或其空构造函数不可访问。

InstantiationException - 如果这个 Class 表示抽象类、接口、数组类、原始类型或 void;或者如果该类没有空构造函数;或者如果实例化由于某种其他原因而失败。

有关更多信息,请参阅 API

于 2013-04-11T06:27:58.750 回答