From 8934eb8464e9efdc560c0d8b1ffb34ddbd18bc0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Wed, 23 Aug 2023 18:07:54 +0200 Subject: [PATCH] Optimize ClassUtils#getMostSpecificMethod This commit optimizes ClassUtils#getMostSpecificMethod which is a method frequently invoked in typical Spring applications. It refines ClassUtils#isOverridable by considering static and final modifiers as non overridable and optimizes its implementation. Closes gh-30272 --- .../java/org/springframework/util/ClassUtils.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/util/ClassUtils.java b/spring-core/src/main/java/org/springframework/util/ClassUtils.java index beba82d1702..a523dfb814a 100644 --- a/spring-core/src/main/java/org/springframework/util/ClassUtils.java +++ b/spring-core/src/main/java/org/springframework/util/ClassUtils.java @@ -50,6 +50,7 @@ import org.springframework.lang.Nullable; * @author Keith Donald * @author Rob Harrop * @author Sam Brannen + * @author Sebastien Deleuze * @since 1.1 * @see TypeUtils * @see ReflectionUtils @@ -83,6 +84,12 @@ public abstract class ClassUtils { /** The ".class" file suffix. */ public static final String CLASS_FILE_SUFFIX = ".class"; + /** Precomputed value for the combination of private, static and final modifiers. */ + private static final int NON_OVERRIDABLE_MODIFIER = Modifier.PRIVATE | Modifier.STATIC | Modifier.FINAL; + + /** Precomputed value for the combination of public and protected modifiers. */ + private static final int OVERRIDABLE_MODIFIER = Modifier.PUBLIC | Modifier.PROTECTED; + /** * Map with primitive wrapper type as key and corresponding primitive @@ -1396,10 +1403,10 @@ public abstract class ClassUtils { * @param targetClass the target class to check against */ private static boolean isOverridable(Method method, @Nullable Class targetClass) { - if (Modifier.isPrivate(method.getModifiers())) { + if ((method.getModifiers() & NON_OVERRIDABLE_MODIFIER) != 0) { return false; } - if (Modifier.isPublic(method.getModifiers()) || Modifier.isProtected(method.getModifiers())) { + if ((method.getModifiers() & OVERRIDABLE_MODIFIER) != 0) { return true; } return (targetClass == null ||