From 337ecc0b0b114a651a70860cb57c9add69d28795 Mon Sep 17 00:00:00 2001 From: Christian Trefzer Date: Thu, 14 Dec 2023 14:55:30 +0100 Subject: [PATCH 1/2] TECH: FieldAccessor: fix multi-level generics resolution --- dump/src/util/dump/reflection/FieldAccessor.java | 15 +++++++++++++++ .../util/dump/reflection/FieldFieldAccessor.java | 2 +- .../util/dump/reflection/MethodFieldAccessor.java | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) 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..8500cc9 100644 --- a/dump/src/util/dump/reflection/MethodFieldAccessor.java +++ b/dump/src/util/dump/reflection/MethodFieldAccessor.java @@ -28,7 +28,7 @@ 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]; + _genericTypes[i] = FieldAccessor.getRawType(actualTypeArguments[i]); if (!_genericTypes[i].equals( setterActualTypeArguments[i] )) { throw new RuntimeException( "getter/setter pair " + getter.getName() + From 4ceff525eb2309baa0dd89eda44344cd9a689b97 Mon Sep 17 00:00:00 2001 From: Christian Trefzer Date: Thu, 14 Dec 2023 14:56:15 +0100 Subject: [PATCH 2/2] TECH: ExternalizationHelper: allow Collection, List, Set as generic type arguments --- dump/src/util/dump/ExternalizationHelper.java | 3 ++- dump/src/util/dump/reflection/MethodFieldAccessor.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) 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/MethodFieldAccessor.java b/dump/src/util/dump/reflection/MethodFieldAccessor.java index 8500cc9..a72da22 100644 --- a/dump/src/util/dump/reflection/MethodFieldAccessor.java +++ b/dump/src/util/dump/reflection/MethodFieldAccessor.java @@ -29,7 +29,7 @@ public MethodFieldAccessor( Method getter, Method setter ) { _genericTypes = new Class[actualTypeArguments.length]; for (int i = 0, length = actualTypeArguments.length; i < length; i++) { _genericTypes[i] = FieldAccessor.getRawType(actualTypeArguments[i]); - if (!_genericTypes[i].equals( setterActualTypeArguments[i] )) { throw new RuntimeException( + if ( !_genericTypes[i].equals(FieldAccessor.getRawType(setterActualTypeArguments[i])) ) { throw new RuntimeException( "getter/setter pair " + getter.getName() + " must have the same generic types. " +