|
18 | 18 | import static org.junit.jupiter.api.Assertions.assertEquals; |
19 | 19 | import static org.junit.jupiter.api.Assertions.assertTrue; |
20 | 20 |
|
| 21 | +import java.io.Serializable; |
21 | 22 | import java.lang.reflect.Field; |
22 | 23 | import java.lang.reflect.GenericArrayType; |
23 | 24 | import java.lang.reflect.Method; |
|
27 | 28 | import java.util.Date; |
28 | 29 | import java.util.List; |
29 | 30 | import java.util.Map; |
| 31 | +import java.util.Map.Entry; |
30 | 32 | import java.util.concurrent.ExecutorService; |
31 | 33 | import java.util.concurrent.Executors; |
32 | 34 | import java.util.concurrent.Future; |
@@ -230,7 +232,6 @@ void returnLv2ArrayOfArray() throws Exception { |
230 | 232 | Type result = TypeParameterResolver.resolveReturnType(method, clazz); |
231 | 233 | assertTrue(result instanceof Class); |
232 | 234 | Class<?> resultClass = (Class<?>) result; |
233 | | - assertTrue(result instanceof Class); |
234 | 235 | assertTrue(resultClass.isArray()); |
235 | 236 | assertTrue(resultClass.getComponentType().isArray()); |
236 | 237 | assertEquals(String.class, resultClass.getComponentType().getComponentType()); |
@@ -553,4 +554,120 @@ public List<Integer> m() { |
553 | 554 | } |
554 | 555 | } |
555 | 556 |
|
| 557 | + @Test |
| 558 | + void shouldParameterizedTypesWithOwnerTypeBeEqual() throws Exception { |
| 559 | + class Clazz { |
| 560 | + @SuppressWarnings("unused") |
| 561 | + public Entry<String, Integer> entry() { |
| 562 | + return null; |
| 563 | + } |
| 564 | + } |
| 565 | + |
| 566 | + Type typeJdk = Clazz.class.getMethod("entry").getGenericReturnType(); |
| 567 | + |
| 568 | + Class<?> clazz = Level2Mapper.class; |
| 569 | + Method method = clazz.getMethod("selectEntry"); |
| 570 | + Type typeMybatis = TypeParameterResolver.resolveReturnType(method, clazz); |
| 571 | + |
| 572 | + assertTrue( |
| 573 | + typeJdk instanceof ParameterizedType && !(typeJdk instanceof TypeParameterResolver.ParameterizedTypeImpl)); |
| 574 | + assertTrue(typeMybatis instanceof TypeParameterResolver.ParameterizedTypeImpl); |
| 575 | + assertTrue(typeJdk.equals(typeMybatis)); |
| 576 | + assertTrue(typeMybatis.equals(typeJdk)); |
| 577 | + } |
| 578 | + |
| 579 | + @Test |
| 580 | + void shouldWildcardTypeBeEqual() throws Exception { |
| 581 | + class WildcardTypeTester { |
| 582 | + @SuppressWarnings("unused") |
| 583 | + public List<? extends Serializable> foo() { |
| 584 | + return null; |
| 585 | + } |
| 586 | + } |
| 587 | + |
| 588 | + Class<?> clazz = WildcardTypeTester.class; |
| 589 | + Method foo = clazz.getMethod("foo"); |
| 590 | + Type typeMybatis = TypeParameterResolver.resolveReturnType(foo, clazz); |
| 591 | + Type typeJdk = foo.getGenericReturnType(); |
| 592 | + |
| 593 | + Type wildcardMybatis = ((ParameterizedType) typeMybatis).getActualTypeArguments()[0]; |
| 594 | + Type wildcardJdk = ((ParameterizedType) typeJdk).getActualTypeArguments()[0]; |
| 595 | + |
| 596 | + assertTrue(wildcardJdk instanceof WildcardType && !(wildcardJdk instanceof TypeParameterResolver.WildcardTypeImpl)); |
| 597 | + assertTrue(wildcardMybatis instanceof TypeParameterResolver.WildcardTypeImpl); |
| 598 | + assertTrue(typeJdk.equals(typeMybatis)); |
| 599 | + assertTrue(typeMybatis.equals(typeJdk)); |
| 600 | + } |
| 601 | + |
| 602 | + @Test |
| 603 | + void shouldGenericArrayTypeBeEqual() throws Exception { |
| 604 | + class GenericArrayTypeTester { |
| 605 | + @SuppressWarnings("unused") |
| 606 | + public List<String>[] foo() { |
| 607 | + return null; |
| 608 | + } |
| 609 | + } |
| 610 | + |
| 611 | + Class<?> clazz = GenericArrayTypeTester.class; |
| 612 | + Method foo = clazz.getMethod("foo"); |
| 613 | + Type typeMybatis = TypeParameterResolver.resolveReturnType(foo, clazz); |
| 614 | + Type typeJdk = foo.getGenericReturnType(); |
| 615 | + |
| 616 | + assertTrue(typeJdk instanceof GenericArrayType && !(typeJdk instanceof TypeParameterResolver.GenericArrayTypeImpl)); |
| 617 | + assertTrue(typeMybatis instanceof TypeParameterResolver.GenericArrayTypeImpl); |
| 618 | + assertTrue(typeJdk.equals(typeMybatis)); |
| 619 | + assertTrue(typeMybatis.equals(typeJdk)); |
| 620 | + } |
| 621 | + |
| 622 | + @Test |
| 623 | + void shouldNestedParamTypeToStringOmitCommonFqn() throws Exception { |
| 624 | + Class<?> clazz = Level2Mapper.class; |
| 625 | + Method method = clazz.getMethod("selectMapEntry"); |
| 626 | + Type type = TypeParameterResolver.resolveReturnType(method, clazz); |
| 627 | + assertEquals("java.util.Map<java.util.Map$Entry<java.lang.String, java.lang.Integer>, java.util.Date>", |
| 628 | + type.toString()); |
| 629 | + } |
| 630 | + |
| 631 | + static class Outer<T> { |
| 632 | + |
| 633 | + class Inner { |
| 634 | + } |
| 635 | + |
| 636 | + public Inner foo() { |
| 637 | + return null; |
| 638 | + } |
| 639 | + |
| 640 | + } |
| 641 | + |
| 642 | + static class InnerTester { |
| 643 | + |
| 644 | + public Outer<?>.Inner noTypeOuter() { |
| 645 | + return null; |
| 646 | + } |
| 647 | + |
| 648 | + public Outer<String>.Inner stringTypeOuter() { |
| 649 | + return null; |
| 650 | + } |
| 651 | + |
| 652 | + } |
| 653 | + |
| 654 | + @Test |
| 655 | + void shouldToStringHandleInnerClass() throws Exception { |
| 656 | + Class<?> outerClass = Outer.class; |
| 657 | + Class<?> innerTesterClass = InnerTester.class; |
| 658 | + Method foo = outerClass.getMethod("foo"); |
| 659 | + Method noTypeOuter = innerTesterClass.getMethod("noTypeOuter"); |
| 660 | + Method stringTypeOuter = innerTesterClass.getMethod("stringTypeOuter"); |
| 661 | + |
| 662 | + Type fooReturnType = TypeParameterResolver.resolveReturnType(foo, outerClass); |
| 663 | + Type noTypeOuterReturnType = TypeParameterResolver.resolveReturnType(noTypeOuter, innerTesterClass); |
| 664 | + Type stringTypeOuterReturnType = TypeParameterResolver.resolveReturnType(stringTypeOuter, innerTesterClass); |
| 665 | + |
| 666 | + assertEquals("org.apache.ibatis.reflection.TypeParameterResolverTest$Outer<T>$Inner", fooReturnType.toString()); |
| 667 | + assertEquals("org.apache.ibatis.reflection.TypeParameterResolverTest$Outer<?>$Inner", |
| 668 | + noTypeOuterReturnType.toString()); |
| 669 | + assertEquals("org.apache.ibatis.reflection.TypeParameterResolverTest$Outer<java.lang.String>$Inner", |
| 670 | + stringTypeOuterReturnType.toString()); |
| 671 | + } |
| 672 | + |
556 | 673 | } |
0 commit comments