|
50 | 50 | import java.beans.PropertyDescriptor;
|
51 | 51 | import java.lang.reflect.Constructor;
|
52 | 52 | import java.lang.reflect.Method;
|
| 53 | +import java.lang.reflect.ParameterizedType; |
| 54 | +import java.lang.reflect.Type; |
53 | 55 | import java.util.ArrayList;
|
54 | 56 | import java.util.Arrays;
|
55 | 57 | import java.util.Collection;
|
@@ -145,6 +147,15 @@ private Optional<TypeInformation<?>> getPropertyInformation(String fieldname) {
|
145 | 147 | }
|
146 | 148 |
|
147 | 149 | return findPropertyDescriptor(rawType, fieldname).map(it -> {
|
| 150 | + |
| 151 | + if(it.getReadMethod() != null) { |
| 152 | + return new NewTypeDiscoverer(ResolvableType.forMethodReturnType(it.getReadMethod(), rawType)); |
| 153 | +// return ClassTypeInformation.fromReturnTypeOf(it.getReadMethod()); |
| 154 | + } |
| 155 | + if(it.getWriteMethod() != null) { |
| 156 | + return new NewTypeDiscoverer(ResolvableType.forMethodParameter(it.getWriteMethod(), 0, rawType)); |
| 157 | + } |
| 158 | + |
148 | 159 | return new NewTypeDiscoverer(ResolvableType.forType(it.getPropertyType(), resolvableType));
|
149 | 160 | });
|
150 | 161 | }
|
@@ -377,15 +388,33 @@ public TypeInformation<?> getSuperTypeInformation(Class<?> superType) {
|
377 | 388 | List<ResolvableType> candidates = new ArrayList<>();
|
378 | 389 |
|
379 | 390 | ResolvableType genericSuperclass = resolvableType.getSuperType();
|
380 |
| - if (genericSuperclass != null) { |
| 391 | + if (genericSuperclass != null && !genericSuperclass.equals(ResolvableType.NONE)) { |
381 | 392 | candidates.add(genericSuperclass);
|
382 | 393 | }
|
383 | 394 |
|
| 395 | + // todo try raw type interfaces // |
| 396 | + |
384 | 397 | candidates.addAll(Arrays.asList(resolvableType.getInterfaces()));
|
385 | 398 |
|
386 | 399 | for (var candidate : candidates) {
|
387 | 400 | if (ObjectUtils.nullSafeEquals(superType, candidate.toClass())) {
|
388 |
| - return new NewTypeDiscoverer(candidate); |
| 401 | + |
| 402 | + if(resolvableType.getType() instanceof Class) { |
| 403 | + |
| 404 | + if(ObjectUtils.isEmpty(((Class)resolvableType.getType()).getTypeParameters())) { |
| 405 | + Class<?>[] classes = candidate.resolveGenerics(null); |
| 406 | + |
| 407 | + if (!Arrays.stream(classes).filter(it -> it != null).findAny().isPresent()) { |
| 408 | + return new NewTypeDiscoverer<>(ResolvableType.forRawClass(superType)); |
| 409 | + } |
| 410 | + } |
| 411 | +// return new NewTypeDiscoverer<>(ResolvableType.forClassWithGenerics(candidate.toClass(), classes)); |
| 412 | + } |
| 413 | +// return new NewTypeDiscoverer(candidate); |
| 414 | +// if(ObjectUtils.isEmpty(superType.getTypeParameters())) { |
| 415 | +// new NewTypeDiscoverer(ResolvableType.forRawClass(superType)); |
| 416 | +// } |
| 417 | + return new NewTypeDiscoverer(ResolvableType.forClass(superType, getType())); |
389 | 418 | } else {
|
390 | 419 | var sup = candidate.getSuperType();
|
391 | 420 | if (sup != null && !ResolvableType.NONE.equals(sup)) {
|
@@ -425,7 +454,14 @@ public List<TypeInformation<?>> getTypeArguments() {
|
425 | 454 | if (!resolvableType.hasGenerics()) {
|
426 | 455 | return Collections.emptyList();
|
427 | 456 | }
|
428 |
| - return Arrays.stream(resolvableType.getGenerics()).map(NewTypeDiscoverer::new).collect(Collectors.toList()); |
| 457 | + |
| 458 | + return Arrays.stream(resolvableType.getGenerics()).map(it -> { |
| 459 | + if(it == null || ResolvableType.NONE.equals(it)) { |
| 460 | + return null; |
| 461 | + } |
| 462 | + return new NewTypeDiscoverer<>(it); |
| 463 | + |
| 464 | + }).collect(Collectors.toList()); |
429 | 465 | }
|
430 | 466 |
|
431 | 467 | @Override
|
|
0 commit comments