|
1 | 1 | package com.fasterxml.jackson.module.androidrecord;
|
2 | 2 |
|
3 |
| -import java.lang.reflect.Field; |
4 |
| -import java.lang.reflect.Modifier; |
5 |
| -import java.lang.reflect.Parameter; |
6 |
| -import java.lang.reflect.Type; |
| 3 | +import java.lang.reflect.*; |
7 | 4 | import java.util.*;
|
8 | 5 | import java.util.stream.Collectors;
|
9 | 6 | import java.util.stream.Stream;
|
@@ -119,7 +116,7 @@ public PotentialCreator findDefaultCreator(MapperConfig<?> config,
|
119 | 116 | AnnotatedConstructor constructor = (AnnotatedConstructor) creator.creator();
|
120 | 117 | Parameter[] parameters = constructor.getAnnotated().getParameters();
|
121 | 118 | Map<String, Type> parameterTypes = Arrays.stream(parameters)
|
122 |
| - .collect(Collectors.toMap(Parameter::getName, Parameter::getParameterizedType)); |
| 119 | + .collect(Collectors.toMap(Parameter::getName, parameter -> fixAndroidGenericType(parameter.getParameterizedType()))); |
123 | 120 |
|
124 | 121 | if (parameterTypes.equals(components)) {
|
125 | 122 | if (foundCreator != null) {
|
@@ -150,4 +147,31 @@ static boolean isDesugaredRecordClass(Class<?> raw) {
|
150 | 147 | static Stream<Field> getDesugaredRecordComponents(Class<?> raw) {
|
151 | 148 | return Arrays.stream(raw.getDeclaredFields()).filter(field -> !Modifier.isStatic(field.getModifiers()));
|
152 | 149 | }
|
| 150 | + |
| 151 | + static Class<?> arrayTypeCompat(Class<?> componentType) { |
| 152 | + return Array.newInstance(componentType, 0).getClass(); |
| 153 | + } |
| 154 | + |
| 155 | + static Type fixAndroidGenericType(Type type) { |
| 156 | + if (type instanceof GenericArrayType) { |
| 157 | + Type componentType = fixAndroidGenericType(((GenericArrayType) type).getGenericComponentType()); |
| 158 | + if (componentType instanceof Class<?>) { |
| 159 | + return arrayTypeCompat((Class<?>) componentType); |
| 160 | + } |
| 161 | + } |
| 162 | + else if (type instanceof ParameterizedType) { |
| 163 | + //if the parameterized type is not actually parameterized, deduce the raw type |
| 164 | + ParameterizedType parameterizedType = (ParameterizedType) type; |
| 165 | + if (parameterizedType.getOwnerType() == null) { |
| 166 | + Type rawType = parameterizedType.getRawType(); |
| 167 | + if (rawType instanceof Class<?>) { |
| 168 | + Class<?> rawComponentClass = (Class<?>) rawType; |
| 169 | + if (rawComponentClass.getTypeParameters().length == 0) { |
| 170 | + return rawComponentClass; |
| 171 | + } |
| 172 | + } |
| 173 | + } |
| 174 | + } |
| 175 | + return type; |
| 176 | + } |
153 | 177 | }
|
0 commit comments