将类类型作为参数传递并创建它的实例

时间:2013-04-11 06:20:03

标签: java oop

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

5 个答案:

答案 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();
}