【问题标题】:How to create class instance by string name如何通过字符串名称创建类实例
【发布时间】:2014-06-04 19:47:59
【问题描述】:

我想通过一个字符串变量创建新的类实例,将 int[] 作为参数传递给这个构造函数,并将这个实例保存在一个数组列表中。

更重要的是,该类派生自其他类,比如 Bar。并且该数组列表的类型为 Bar。所以:

    List<Bar> something = new ArrayList<Bar>();
    String name = "Foo";
    int[] arr = {1, 2, 3, 4, 5};
    try {
        Class myClass = Class.forName(name);
        Class[] types = {Integer.TYPE};
        Constructor constructor = myClass.getConstructor(types);
        Object[] parameters = {arr};
        Object instanceOfMyClass = constructor.newInstance(parameters);
        something.add(instanceOfMyClass);
    } catch(ClassNotFoundException e) {
        // handle it
    } catch(NoSuchMethodException e) {
        // handle it
    } catch(InstantiationException e) {
        // handle it
    } catch(IllegalAccessException e) {
        // handle it
    } catch(InvocationTargetException e) {
        // handle it
    }

这是我想出的,但不幸的是它不起作用。如何在这里传递整数数组(类型是什么)?如何将此实例添加到此处给出的数组列表中(它会引发错误,我必须将 Foo 类的实例强制转换为 Foo 类)?

【问题讨论】:

  • something.add( (Bar) instanceOfMyClass );
  • 哪一行报错了?堆栈跟踪是什么? (或者这是编译时错误?)
  • 好吧,这实际上并不重要,因为只有这两件事会给出错误,并且纠正它是有效的,谢谢! ;)

标签: java


【解决方案1】:
Class[] types = {Integer.TYPE};
Constructor constructor = myClass.getConstructor(types);

这会查找一个构造函数,它采用 intInteger,而不是 ints 的数组。

如果要查找采用int[] 的构造函数,则传递正确的参数:

Class[] types = { int[].class };
Constructor constructor = myClass.getConstructor(types);

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多