1

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

CloneUtils.cloneList(list);

里面的cloneList样子是这样的:

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使用反射传递给方法的对象具有相同类型的新对象?

编辑1

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

String[] fields = field.split(",");
list = Arrays.asList(fields);    
4

3 回答 3

1

该操作Arrays.asList(String[]);返回Arrays.ArrayList,而不是 java.util.ArrayList。

请参阅 asList 实现,

   public static <T> List<T> asList(final T... a)
   {
     return new Arrays.ArrayList(a);
   }

Arrays.ArrayList 是 ArraysClass 中的静态内部类

 private static final class ArrayList<E> extends AbstractList<E> 
     implements Serializable, RandomAccess
  {
  ..
  ..

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

于 2012-10-09T15:14:28.977 回答
0

只要原始对象的类有一个无参数构造函数,那么这将起作用。(ArrayList 确实有一个无参数的构造函数,并且可以正常工作)

static Object makeSameType(Object original) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Class<?> originalClass = original.getClass();
        Constructor<?> con = originalClass.getConstructor();
        return con.newInstance();
    }
于 2012-10-09T15:10:11.427 回答
0

来源-Arrays$ArrayList似乎该类没有空构造函数,因此您不能用空实例化它newInstance()

请注意,您从中获得异常的类 isjava.util.Arrays$ArrayList和 NOT java.util.ArrayList

反射的问题是 - 你不确切知道如何实例化所有对象 - 所以构建“所有情况下的实例化”几乎是不可能的,除非你有一些关于必须实现构造函数的指导规则。

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

于 2012-10-09T14:54:02.753 回答