|
32 | 32 | import static org.hibernate.internal.util.ReflectHelper.NO_PARAM_SIGNATURE;
|
33 | 33 | import static org.hibernate.internal.util.ReflectHelper.findField;
|
34 | 34 | import static org.hibernate.internal.util.ReflectHelper.isRecord;
|
| 35 | +import static org.hibernate.internal.util.ReflectHelper.shouldSkipInterfaceCheck; |
35 | 36 |
|
36 | 37 | /**
|
37 | 38 | * @author Steve Ebersole
|
@@ -82,9 +83,56 @@ public static AccessType getAccessType(Class<?> containerJavaType, String proper
|
82 | 83 | && field.isAnnotationPresent( Access.class )
|
83 | 84 | && !field.isAnnotationPresent( Transient.class )
|
84 | 85 | && !Modifier.isStatic( field.getModifiers() ) ) {
|
85 |
| - return AccessType.FIELD; |
| 86 | + AccessType accessType = getAccessTypeOrNull(field); |
| 87 | + return accessType == null ? AccessType.FIELD : accessType; |
| 88 | + //return AccessType.FIELD; |
86 | 89 | }
|
87 | 90 |
|
| 91 | + Class<?> checkClass = containerClass; |
| 92 | + AccessType accessType = null; |
| 93 | + while ( accessType == null && checkClass != null ) { |
| 94 | + if ( checkClass.equals( Object.class ) ) { |
| 95 | + break; |
| 96 | + } |
| 97 | + accessType = getGetterAccessTypeOrNull( checkClass, propertyName ); |
| 98 | + |
| 99 | + // if no accessType found yet, check all implemented interfaces |
| 100 | + if ( accessType == null ) { |
| 101 | + accessType = getGetterAccessTypeOrNull( checkClass.getInterfaces(), propertyName ); |
| 102 | + } |
| 103 | + |
| 104 | + checkClass = checkClass.getSuperclass(); |
| 105 | + } |
| 106 | + |
| 107 | + return accessType; |
| 108 | + } |
| 109 | + |
| 110 | + private static @Nullable AccessType getGetterAccessTypeOrNull(Class<?>[] interfaces, String propertyName) { |
| 111 | + AccessType accessType = null; |
| 112 | + for ( int i = 0; accessType == null && i < interfaces.length; ++i ) { |
| 113 | + final Class<?> anInterface = interfaces[i]; |
| 114 | + if ( shouldSkipInterfaceCheck( anInterface ) ) { |
| 115 | + continue; |
| 116 | + } |
| 117 | + accessType = getGetterAccessTypeOrNull( anInterface, propertyName ); |
| 118 | + if ( accessType == null ) { |
| 119 | + // if no getter found yet, check all implemented interfaces of interface |
| 120 | + accessType = getGetterAccessTypeOrNull( anInterface.getInterfaces(), propertyName ); |
| 121 | + } |
| 122 | + } |
| 123 | + return accessType; |
| 124 | + } |
| 125 | + |
| 126 | + private static @Nullable AccessType getGetterAccessTypeOrNull(Class<?> containerClass, String propertyName){ |
| 127 | + if ( isRecord( containerClass ) ) { |
| 128 | + try { |
| 129 | + containerClass.getMethod( propertyName, NO_PARAM_SIGNATURE ); |
| 130 | + return AccessType.PROPERTY; |
| 131 | + } |
| 132 | + catch (NoSuchMethodException e) { |
| 133 | + // Ignore |
| 134 | + } |
| 135 | + } |
88 | 136 | for ( Method method : containerClass.getDeclaredMethods() ) {
|
89 | 137 | // if the method has parameters, skip it
|
90 | 138 | if ( method.getParameterCount() != 0 ) {
|
|
0 commit comments