HHH-11554 - Enable super interfaces traversal for getter/setter methods.

This commit is contained in:
Chris Cranford 2017-03-07 10:13:48 -05:00 committed by Andrea Boriero
parent fab264a8b2
commit 9ae391436a

View File

@ -31,6 +31,7 @@
* *
* @author Gavin King * @author Gavin King
* @author Steve Ebersole * @author Steve Ebersole
* @author Chris Cranford
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public final class ReflectHelper { public final class ReflectHelper {
@ -407,12 +408,7 @@ public static Method findGetterMethod(Class containerClass, String propertyName)
// if no getter found yet, check all implemented interfaces // if no getter found yet, check all implemented interfaces
if ( getter == null ) { if ( getter == null ) {
for ( Class theInterface : containerClass.getInterfaces() ) { getter = getGetterOrNull( containerClass.getInterfaces(), propertyName );
getter = getGetterOrNull( theInterface, propertyName );
if ( getter != null ) {
break;
}
}
} }
if ( getter == null ) { if ( getter == null ) {
@ -430,6 +426,19 @@ public static Method findGetterMethod(Class containerClass, String propertyName)
return getter; return getter;
} }
private static Method getGetterOrNull(Class[] interfaces, String propertyName) {
Method getter = null;
for ( int i = 0; getter == null && i < interfaces.length; ++i ) {
final Class anInterface = interfaces[i];
getter = getGetterOrNull( anInterface, propertyName );
if ( getter == null ) {
// if no getter found yet, check all implemented interfaces of interface
getter = getGetterOrNull( anInterface.getInterfaces(), propertyName );
}
}
return getter;
}
private static Method getGetterOrNull(Class containerClass, String propertyName) { private static Method getGetterOrNull(Class containerClass, String propertyName) {
for ( Method method : containerClass.getDeclaredMethods() ) { for ( Method method : containerClass.getDeclaredMethods() ) {
// if the method has parameters, skip it // if the method has parameters, skip it
@ -539,12 +548,13 @@ public static Method findSetterMethod(Class containerClass, String propertyName,
// if no setter found yet, check all implemented interfaces // if no setter found yet, check all implemented interfaces
if ( setter == null ) { if ( setter == null ) {
for ( Class theInterface : containerClass.getInterfaces() ) { setter = setterOrNull( containerClass.getInterfaces(), propertyName, propertyType );
setter = setterOrNull( theInterface, propertyName, propertyType ); // for ( Class theInterface : containerClass.getInterfaces() ) {
if ( setter != null ) { // setter = setterOrNull( theInterface, propertyName, propertyType );
break; // if ( setter != null ) {
} // break;
} // }
// }
} }
if ( setter == null ) { if ( setter == null ) {
@ -562,6 +572,19 @@ public static Method findSetterMethod(Class containerClass, String propertyName,
return setter; return setter;
} }
private static Method setterOrNull(Class[] interfaces, String propertyName, Class propertyType) {
Method setter = null;
for ( int i = 0; setter == null && i < interfaces.length; ++i ) {
final Class anInterface = interfaces[i];
setter = setterOrNull( anInterface, propertyName, propertyType );
if ( setter == null ) {
// if no setter found yet, check all implemented interfaces of interface
setter = setterOrNull( anInterface.getInterfaces(), propertyName, propertyType );
}
}
return setter;
}
private static Method setterOrNull(Class theClass, String propertyName, Class propertyType) { private static Method setterOrNull(Class theClass, String propertyName, Class propertyType) {
Method potentialSetter = null; Method potentialSetter = null;