【问题标题】:Java, making constructor call using list of parameters?Java,使用参数列表进行构造函数调用?
【发布时间】:2015-10-21 02:41:06
【问题描述】:

所以,我正在从文件中读取数据,并且根据读取的文本,程序将使用与行上的参数匹配的类的构造函数。所以将文本行给定的参数存储到一个ArrayList中:

List<Object> parameters = new ArrayList<Object>();

然后我应该能够以某种方式从这些参数创建一个对象,如下所示:

constructor.newInstance(objects);

但我不太确定如何做到这一点?

try {
            Class<?> objectClass = Class.forName("com.editor.object." +line.substring(4, from+4));
            Constructor[] allConstructors = objectClass.getDeclaredConstructors();
            for(Constructor constructor : allConstructors){
                Class<?>[] parameters = constructor.getParameterTypes();
                if(objects.size() == parameters.length){
                    for(int i = 0; i < parameters.length; i++){
                        if(objects.get(i).getClass().equals(parameters[i])){
                            if(i + 1 == parameters.length){
                                return constructor.newInstance(objects); //<-- This doesen't work, I have no idea how should I call the "random" constructor?
                            }
                        }
                    }
                }
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

编辑 1: 一个例子: 我有以下行

新平台(1, 1, 1, 1, 1);

-> 将使用给定的参数创建一个新的平台对象。引用的类和构造函数可能几乎是任何东西,所以我不能依赖这样的东西。当然我可以在代码中运行它,但我想了解更多,这就是为什么我不会用最简单的方法来做。

【问题讨论】:

  • Activator.createInstance() 可能有用。
  • 我认为您应该使用parameters[i].isAssignableFrom(objects.get(i).getClass()) 而不是equals,因为您不一定需要完全相同的类。
  • 以上有什么不好的地方?
  • @AndyTurner Turner 在代码中添加注释指出我不知道如何处理的部分。
  • @nautilus_rs - 致电constructor.newInstance(objects.toArray())。您目前正在有效地调用ctor.newInstance(new Object[] { objects })

标签: java object arraylist parameters constructor


【解决方案1】:

Constructor.newInstance 是一个可变参数方法:它的类型签名是Constructor.newInstance(Object... args)。如果您使用 ArrayList 作为单个参数调用它,则将被解释为:

Constructor.newInstance(new Object[] { objects })

因为ArrayList 不是数组类型。这将失败,除非该构造函数碰巧接受单个 List 参数,即使那样它也很可能会失败,因为列表中的元素不是该构造函数所需的类型。

相反,您可以调用它:

Constructor.newInstance(objects.toArray())

从调用构造函数的角度来看,它将列表“分解”成单独的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2011-10-08
    • 2012-07-28
    相关资源
    最近更新 更多