Java 构造实现列表接口的对象时的实例化异常

Java 构造实现列表接口的对象时的实例化异常,java,reflection,collections,Java,Reflection,Collections,我有一个克隆不同对象的旧代码list声明为java.util.list CloneUtils.cloneList(list); 在克隆列表中如下所示: public static List cloneList(final List list) throws CloneNotSupportedException { List list2; try { list2 = list.getClass().newInstance(); } catch (Excep

我有一个克隆不同对象的旧代码
list
声明为java.util.list

CloneUtils.cloneList(list);
克隆列表中
如下所示:

public static List cloneList(final List list) throws CloneNotSupportedException {
    List list2;
    try {
        list2 = list.getClass().newInstance();
    } catch (Exception e) {
        Log.debug(e);
        list2 = new ArrayList();
    }
调用
cloneList
会引发异常:

jvm 1    | DEBUG[2012-10-09 16:57:58,611]: java.util.Arrays$ArrayList
jvm 1    | java.lang.InstantiationException: java.util.Arrays$ArrayList
jvm 1    |      at java.lang.Class.newInstance0(Class.java:340)
jvm 1    |      at java.lang.Class.newInstance(Class.java:308)
jvm 1    |      at com.acme.common.util.CloneUtils.cloneList(CloneUtils.java:
88)
jvm 1    |      at com.acme.common.data.PropertyDescriptor.clone(PropertyDesc
riptor.java:165)
jvm 1    |      at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
jvm 1    |      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMet
hodAccessorImpl.java:25)
jvm 1    |      at java.lang.reflect.Method.invoke(Method.java:597)
是否可以使用反射创建与传递给
cloneList
方法的对象类型相同的新对象

Edit1

传递给
cloneList
方法的
list
参数来自:

String[] fields = field.split(",");
list = Arrays.asList(fields);    
Arrays$ArrayList
-类似乎没有空的构造函数,因此不能用空的
newInstance()实例化它

请注意,从中获取异常的类是
java.util.Arrays$ArrayList
,而不是

反射的问题是——您不知道如何实例化所有对象——因此构建“所有实例实例化”几乎是不可能的,除非您有一些必须实现构造函数的指导规则

另一种方法,在大多数情况下可能是使用而不是反射来创建新对象,但我怀疑您在这里使用它而不需要进行更多修改。

来自
数组$ArrayList
-类似乎没有空构造函数,因此,不能使用空的
newInstance()

请注意,从中获取异常的类是
java.util.Arrays$ArrayList
,而不是

反射的问题是——您不知道如何实例化所有对象——因此构建“所有实例实例化”几乎是不可能的,除非您有一些必须实现构造函数的指导规则


另一种选择,在大多数情况下可能是使用而不是反射来创建新对象,但我怀疑您在这里使用它而不需要进行更多修改。

只要原始对象的类具有无参数构造函数,那么这将起作用。(ArrayList确实有一个无参数构造函数,可以很好地使用它)

静态对象makeSameType(对象原始)抛出NoSuchMethodException、SecurityException、InstanceionException、IllegalAccessException、IllegalArgumentException、InvocationTargetException{
类originalClass=original.getClass();
构造函数con=originalClass.getConstructor();
返回con.newInstance();
}

只要原始对象的类有一个无参数构造函数,那么它就可以工作。(ArrayList确实有一个无参数构造函数,可以很好地使用它)

静态对象makeSameType(对象原始)抛出NoSuchMethodException、SecurityException、InstanceionException、IllegalAccessException、IllegalArgumentException、InvocationTargetException{
类originalClass=original.getClass();
构造函数con=originalClass.getConstructor();
返回con.newInstance();
}

操作
数组.asList(字符串[])返回Arrays.ArrayList,而不是java.util.ArrayList

请参见asList实现

   public static <T> List<T> asList(final T... a)
   {
     return new Arrays.ArrayList(a);
   }
公共静态列表asList(最终T…a)
{
返回新数组;
}
Arrays.ArrayList是ArraysClass中的静态内部类

 private static final class ArrayList<E> extends AbstractList<E> 
     implements Serializable, RandomAccess
  {
  ..
  ..
私有静态最终类ArrayList扩展了AbstractList
实现可序列化、随机访问
{
..
..

但我不明白的是这种操作的意图(以不同的方式克隆列表)。

操作
Arrays.asList(String[]);
returnArrays.ArrayList,而不是java.util.ArrayList

请参见asList实现

   public static <T> List<T> asList(final T... a)
   {
     return new Arrays.ArrayList(a);
   }
公共静态列表asList(最终T…a)
{
返回新数组;
}
Arrays.ArrayList是ArraysClass中的静态内部类

 private static final class ArrayList<E> extends AbstractList<E> 
     implements Serializable, RandomAccess
  {
  ..
  ..
私有静态最终类ArrayList扩展了AbstractList
实现可序列化、随机访问
{
..
..

但我不明白的是这种操作的意图(以不同的方式克隆列表).

检查关闭器:它是
数组。ArrayList
——通过
数组获得的一个。asList
。它没有空构造函数。检查关闭器:它是
数组。ArrayList
——通过
数组获得的一个。asList
。它没有空构造函数。