1

さまざまなオブジェクトを複製する古いコードがあります。java.util.Listlistとして宣言されています

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

操作は、java.util.ArrayListではなくArrays.ArrayListArrays.asList(String[]);を返します。

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 に答える