Avoid pattern matching in isCglibRenamedMethod as far as possible (for performance reasons)

Issue: SPR-11894
master
Juergen Hoeller 10 years ago
parent d6635802c4
commit 938a2846c8
  1. 20
      spring-core/src/main/java/org/springframework/util/ReflectionUtils.java

@ -44,11 +44,17 @@ import java.util.regex.Pattern;
*/ */
public abstract class ReflectionUtils { public abstract class ReflectionUtils {
/**
* Naming prefix for CGLIB-renamed methods.
* @see #isCglibRenamedMethod
*/
private static final String CGLIB_RENAMED_METHOD_PREFIX = "CGLIB$";
/** /**
* Pattern for detecting CGLIB-renamed methods. * Pattern for detecting CGLIB-renamed methods.
* @see #isCglibRenamedMethod * @see #isCglibRenamedMethod
*/ */
private static final Pattern CGLIB_RENAMED_METHOD_PATTERN = Pattern.compile("CGLIB\\$(.+)\\$\\d+"); private static final Pattern CGLIB_RENAMED_METHOD_PATTERN = Pattern.compile("(.+)\\$\\d+");
/** /**
@ -397,7 +403,9 @@ public abstract class ReflectionUtils {
* @see org.springframework.cglib.proxy.Enhancer#rename * @see org.springframework.cglib.proxy.Enhancer#rename
*/ */
public static boolean isCglibRenamedMethod(Method renamedMethod) { public static boolean isCglibRenamedMethod(Method renamedMethod) {
return CGLIB_RENAMED_METHOD_PATTERN.matcher(renamedMethod.getName()).matches(); String name = renamedMethod.getName();
return (name.startsWith(CGLIB_RENAMED_METHOD_PREFIX) &&
CGLIB_RENAMED_METHOD_PATTERN.matcher(name.substring(CGLIB_RENAMED_METHOD_PREFIX.length())).matches());
} }
/** /**
@ -424,8 +432,8 @@ public abstract class ReflectionUtils {
* @see java.lang.reflect.Method#setAccessible * @see java.lang.reflect.Method#setAccessible
*/ */
public static void makeAccessible(Method method) { public static void makeAccessible(Method method) {
if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) &&
&& !method.isAccessible()) { !method.isAccessible()) {
method.setAccessible(true); method.setAccessible(true);
} }
} }
@ -439,8 +447,8 @@ public abstract class ReflectionUtils {
* @see java.lang.reflect.Constructor#setAccessible * @see java.lang.reflect.Constructor#setAccessible
*/ */
public static void makeAccessible(Constructor<?> ctor) { public static void makeAccessible(Constructor<?> ctor) {
if ((!Modifier.isPublic(ctor.getModifiers()) || !Modifier.isPublic(ctor.getDeclaringClass().getModifiers())) if ((!Modifier.isPublic(ctor.getModifiers()) || !Modifier.isPublic(ctor.getDeclaringClass().getModifiers())) &&
&& !ctor.isAccessible()) { !ctor.isAccessible()) {
ctor.setAccessible(true); ctor.setAccessible(true);
} }
} }

Loading…
Cancel
Save