Skip to content

Commit 8145598

Browse files
committed
Prevent getDeclaredField calls by iterating over all fields
This saves on throwing exceptions everytime a field was not found, for the cost of copying the fields arrays on each invocation. This is still magnitudes faster though.
1 parent 37b219c commit 8145598

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

hibernate-core/src/main/java/org/hibernate/internal/util/ReflectHelper.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -423,16 +423,14 @@ private static Field locateField(Class clazz, String propertyName) {
423423
return null;
424424
}
425425

426-
try {
427-
Field field = clazz.getDeclaredField( propertyName );
428-
if ( !isStaticField( field ) ) {
429-
return field;
430-
}
426+
Field field = findField(propertyName, clazz.getDeclaredFields());
427+
if (field == null) {
431428
return locateField( clazz.getSuperclass(), propertyName );
432429
}
433-
catch ( NoSuchFieldException nsfe ) {
434-
return locateField( clazz.getSuperclass(), propertyName );
430+
if ( !isStaticField( field ) ) {
431+
return field;
435432
}
433+
return locateField( clazz.getSuperclass(), propertyName );
436434
}
437435

438436
public static boolean isStaticField(Field field) {
@@ -546,6 +544,15 @@ private static Method findMethod(String name, Method[] methods) {
546544
return null;
547545
}
548546

547+
private static Field findField(String name, Field[] methods) {
548+
for (Field field : methods) {
549+
if (field.getName().equals(name)) {
550+
return field;
551+
}
552+
}
553+
return null;
554+
}
555+
549556
private static void verifyNoIsVariantExists(
550557
Class containerClass,
551558
String propertyName,

0 commit comments

Comments
 (0)