【问题标题】:New instance of an arbitrary class [duplicate]任意类的新实例[重复]
【发布时间】:2014-05-09 00:47:59
【问题描述】:

在 Java 中,如何创建一个类的新实例,直到代码运行才选择该类?

List<Class> classes = new ArrayList<>();
classes.add(String.class);
classes.add(ArrayList.class);
classes.add(Integer.class);
classes.add(Random.class);

Random r = new Random();
Class c = classes.get(r.nextInt(classes.size()));

Object o = // new instance of "c"

【问题讨论】:

  • c.newInstance() 提供默认构造函数
  • @JigarJoshi:那是什么?如果您提供了代码示例,这可能是一个很好的答案。
  • @JigarJoshi 对.. 但new String() 对你帮助不大。
  • @JigarJoshi 好吧,如果你得到Integer.class,那你就不走运了。

标签: java class constructor


【解决方案1】:

如果你知道这个类有一个无参数的构造函数,你可以直接调用c.newInstance()。否则,您需要调用接受参数的newInstance() 的重载版本。

【讨论】:

    【解决方案2】:

    尝试这种方式,但不是一个好方法。

    Class<?> clazz = String.class;
    Constructor<?> ctor = clazz.getConstructor(String.class);
    Object object = ctor.newInstance(new Object[] { "abc" });
    
    System.out.println(object); // print abc
    

    【讨论】:

    • 对象 java.lang.Class.newInstance() 抛出 InstantiationException,IllegalAccessException 已弃用。此方法传播由 nullary 构造函数引发的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译器执行的编译时异常检查。 Constructor.newInstance 方法通过将构造函数抛出的任何异常包装在(已检查的)java.lang.reflect.InvocationTargetException 中来避免此问题。
    猜你喜欢
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多