diff --git a/dump/src/util/dump/ExternalizationHelper.java b/dump/src/util/dump/ExternalizationHelper.java index e228f49..afc0708 100644 --- a/dump/src/util/dump/ExternalizationHelper.java +++ b/dump/src/util/dump/ExternalizationHelper.java @@ -49,7 +49,8 @@ class ExternalizationHelper { private static final Set> IMPLEMENTED_GENERICS = Set.of( // Boolean.class, Byte.class, Character.class, Short.class, Integer.class, Long.class, Float.class, Double.class, // String.class, Enum.class, // - boolean[].class, byte[].class, char[].class, short[].class, int[].class, long[].class, float[].class, double[].class // + boolean[].class, byte[].class, char[].class, short[].class, int[].class, long[].class, float[].class, double[].class, // + Collection.class, List.class, Set.class // ); static boolean USE_UNSAFE_FIELD_ACCESSORS = true; diff --git a/dump/src/util/dump/reflection/FieldAccessor.java b/dump/src/util/dump/reflection/FieldAccessor.java index 6acc07c..2504b12 100644 --- a/dump/src/util/dump/reflection/FieldAccessor.java +++ b/dump/src/util/dump/reflection/FieldAccessor.java @@ -1,7 +1,22 @@ package util.dump.reflection; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + + public interface FieldAccessor { + static Class getRawType( Type type ) { + if ( type instanceof Class klass ) { + return klass; + } + if ( type instanceof ParameterizedType pt ) { + return getRawType(pt.getRawType()); + } + + throw new IllegalArgumentException(type.getClass() + " not supporteed"); + } + public Object get( Object obj ) throws Exception; public boolean getBoolean( Object obj ) throws Exception; diff --git a/dump/src/util/dump/reflection/FieldFieldAccessor.java b/dump/src/util/dump/reflection/FieldFieldAccessor.java index f6eb3b6..db9c12f 100644 --- a/dump/src/util/dump/reflection/FieldFieldAccessor.java +++ b/dump/src/util/dump/reflection/FieldFieldAccessor.java @@ -19,7 +19,7 @@ public FieldFieldAccessor( Field field ) { Type[] actualTypeArguments = ((ParameterizedType)type).getActualTypeArguments(); _genericTypes = new Class[actualTypeArguments.length]; for (int i = 0, length = actualTypeArguments.length; i < length; i++) { - _genericTypes[i] = (Class)actualTypeArguments[i]; + _genericTypes[i] = FieldAccessor.getRawType(actualTypeArguments[i]); } } } diff --git a/dump/src/util/dump/reflection/MethodFieldAccessor.java b/dump/src/util/dump/reflection/MethodFieldAccessor.java index 186090a..a72da22 100644 --- a/dump/src/util/dump/reflection/MethodFieldAccessor.java +++ b/dump/src/util/dump/reflection/MethodFieldAccessor.java @@ -28,8 +28,8 @@ public MethodFieldAccessor( Method getter, Method setter ) { Type[] setterActualTypeArguments = ((ParameterizedType)setterTypes).getActualTypeArguments(); _genericTypes = new Class[actualTypeArguments.length]; for (int i = 0, length = actualTypeArguments.length; i < length; i++) { - _genericTypes[i] = (Class)actualTypeArguments[i]; - if (!_genericTypes[i].equals( setterActualTypeArguments[i] )) { throw new RuntimeException( + _genericTypes[i] = FieldAccessor.getRawType(actualTypeArguments[i]); + if ( !_genericTypes[i].equals(FieldAccessor.getRawType(setterActualTypeArguments[i])) ) { throw new RuntimeException( "getter/setter pair " + getter.getName() + " must have the same generic types. " +