From 1fd447f395781db9a53ba14207dc07af33de6412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=A6=D1=8B=D0=BF?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Tue, 10 Mar 2020 18:16:08 +0200 Subject: [PATCH] Reduce String garbage in CglibAopProxy.doValidateClass() Closes gh-24672 --- .../aop/framework/CglibAopProxy.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java b/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java index a58ae43ced..1f5faf3a75 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java @@ -253,20 +253,24 @@ class CglibAopProxy implements AopProxy, Serializable { */ private void doValidateClass(Class proxySuperClass, @Nullable ClassLoader proxyClassLoader, Set> ifcs) { if (proxySuperClass != Object.class) { + final boolean infoEnabled = logger.isInfoEnabled(); + final boolean debugEnabled = logger.isDebugEnabled(); Method[] methods = proxySuperClass.getDeclaredMethods(); for (Method method : methods) { int mod = method.getModifiers(); if (!Modifier.isStatic(mod) && !Modifier.isPrivate(mod)) { if (Modifier.isFinal(mod)) { - if (implementsInterface(method, ifcs)) { + if (infoEnabled && implementsInterface(method, ifcs)) { logger.info("Unable to proxy interface-implementing method [" + method + "] because " + "it is marked as final: Consider using interface-based JDK proxies instead!"); } - logger.debug("Final method [" + method + "] cannot get proxied via CGLIB: " + - "Calls to this method will NOT be routed to the target instance and " + - "might lead to NPEs against uninitialized fields in the proxy instance."); + if (debugEnabled) { + logger.debug("Final method [" + method + "] cannot get proxied via CGLIB: " + + "Calls to this method will NOT be routed to the target instance and " + + "might lead to NPEs against uninitialized fields in the proxy instance."); + } } - else if (!Modifier.isPublic(mod) && !Modifier.isProtected(mod) && + else if (debugEnabled && !Modifier.isPublic(mod) && !Modifier.isProtected(mod) && proxyClassLoader != null && proxySuperClass.getClassLoader() != proxyClassLoader) { logger.debug("Method [" + method + "] is package-visible across different ClassLoaders " + "and cannot get proxied via CGLIB: Declare this method as public or protected " + @@ -526,7 +530,7 @@ class CglibAopProxy implements AopProxy, Serializable { private static class StaticDispatcher implements Dispatcher, Serializable { @Nullable - private Object target; + private final Object target; public StaticDispatcher(@Nullable Object target) { this.target = target; @@ -552,7 +556,7 @@ class CglibAopProxy implements AopProxy, Serializable { } @Override - public Object loadObject() throws Exception { + public Object loadObject() { return this.advised; } } @@ -959,11 +963,11 @@ class CglibAopProxy implements AopProxy, Serializable { return true; } - private boolean equalsAdviceClasses(Advisor a, Advisor b) { + private static boolean equalsAdviceClasses(Advisor a, Advisor b) { return (a.getAdvice().getClass() == b.getAdvice().getClass()); } - private boolean equalsPointcuts(Advisor a, Advisor b) { + private static boolean equalsPointcuts(Advisor a, Advisor b) { // If only one of the advisor (but not both) is PointcutAdvisor, then it is a mismatch. // Takes care of the situations where an IntroductionAdvisor is used (see SPR-3959). return (!(a instanceof PointcutAdvisor) ||