From 032b52e668f74b7d5e3664893a7d606d8699dc2f Mon Sep 17 00:00:00 2001 From: HelloOO7 Date: Tue, 3 Sep 2024 19:27:07 +0200 Subject: [PATCH 1/2] android-record: Adapt generic types returned by Android reflection to follow Java behavior. --- .../androidrecord/AndroidRecordModule.java | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/android-record/src/main/java/com/fasterxml/jackson/module/androidrecord/AndroidRecordModule.java b/android-record/src/main/java/com/fasterxml/jackson/module/androidrecord/AndroidRecordModule.java index efea669d..92ee6dba 100644 --- a/android-record/src/main/java/com/fasterxml/jackson/module/androidrecord/AndroidRecordModule.java +++ b/android-record/src/main/java/com/fasterxml/jackson/module/androidrecord/AndroidRecordModule.java @@ -1,9 +1,6 @@ package com.fasterxml.jackson.module.androidrecord; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.lang.reflect.Parameter; -import java.lang.reflect.Type; +import java.lang.reflect.*; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -119,7 +116,7 @@ public PotentialCreator findDefaultCreator(MapperConfig config, AnnotatedConstructor constructor = (AnnotatedConstructor) creator.creator(); Parameter[] parameters = constructor.getAnnotated().getParameters(); Map parameterTypes = Arrays.stream(parameters) - .collect(Collectors.toMap(Parameter::getName, Parameter::getParameterizedType)); + .collect(Collectors.toMap(Parameter::getName, parameter -> fixAndroidGenericType(parameter.getParameterizedType()))); if (parameterTypes.equals(components)) { if (foundCreator != null) { @@ -150,4 +147,30 @@ static boolean isDesugaredRecordClass(Class raw) { static Stream getDesugaredRecordComponents(Class raw) { return Arrays.stream(raw.getDeclaredFields()).filter(field -> !Modifier.isStatic(field.getModifiers())); } + + static Class arrayTypeCompat(Class componentType) { + return Array.newInstance(componentType, 0).getClass(); + } + + static Type fixAndroidGenericType(Type type) { + if (type instanceof GenericArrayType) { + //recurse into component type + Type componentType = fixAndroidGenericType(((GenericArrayType) type).getGenericComponentType()); + if (componentType instanceof Class) { //if it isn't generic, return the raw array type + return arrayTypeCompat((Class) componentType); + } + } + else if (type instanceof ParameterizedType) { + //if the parameterized type is not actually parameterized, deduce the raw type + ParameterizedType parameterizedType = (ParameterizedType) type; + Type rawType = parameterizedType.getRawType(); + if (rawType instanceof Class) { + Class rawComponentClass = (Class) rawType; + if (rawComponentClass.getTypeParameters().length == 0) { + return rawComponentClass; + } + } + } + return type; + } } From fb007fd75c20f88c7510d831826dff14811eb72a Mon Sep 17 00:00:00 2001 From: HelloOO7 Date: Tue, 3 Sep 2024 19:30:04 +0200 Subject: [PATCH 2/2] android-record: Adapt generic types returned by Android reflection to follow Java behavior. --- .../module/androidrecord/AndroidRecordModule.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/android-record/src/main/java/com/fasterxml/jackson/module/androidrecord/AndroidRecordModule.java b/android-record/src/main/java/com/fasterxml/jackson/module/androidrecord/AndroidRecordModule.java index 92ee6dba..4ac5c872 100644 --- a/android-record/src/main/java/com/fasterxml/jackson/module/androidrecord/AndroidRecordModule.java +++ b/android-record/src/main/java/com/fasterxml/jackson/module/androidrecord/AndroidRecordModule.java @@ -154,20 +154,21 @@ static Class arrayTypeCompat(Class componentType) { static Type fixAndroidGenericType(Type type) { if (type instanceof GenericArrayType) { - //recurse into component type Type componentType = fixAndroidGenericType(((GenericArrayType) type).getGenericComponentType()); - if (componentType instanceof Class) { //if it isn't generic, return the raw array type + if (componentType instanceof Class) { return arrayTypeCompat((Class) componentType); } } else if (type instanceof ParameterizedType) { //if the parameterized type is not actually parameterized, deduce the raw type ParameterizedType parameterizedType = (ParameterizedType) type; - Type rawType = parameterizedType.getRawType(); - if (rawType instanceof Class) { - Class rawComponentClass = (Class) rawType; - if (rawComponentClass.getTypeParameters().length == 0) { - return rawComponentClass; + if (parameterizedType.getOwnerType() == null) { + Type rawType = parameterizedType.getRawType(); + if (rawType instanceof Class) { + Class rawComponentClass = (Class) rawType; + if (rawComponentClass.getTypeParameters().length == 0) { + return rawComponentClass; + } } } }