From 64788152910a84e7755a8302896a1fa2d5ecef7d Mon Sep 17 00:00:00 2001 From: Yasser Zamani Date: Sun, 18 Jun 2017 13:15:53 +0430 Subject: [PATCH] WW-4805 Improves ProxyUtil performance via caching --- .../opensymphony/xwork2/util/ProxyUtil.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/util/ProxyUtil.java b/core/src/main/java/com/opensymphony/xwork2/util/ProxyUtil.java index 83e727cd3..b275bad53 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/ProxyUtil.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/ProxyUtil.java @@ -20,6 +20,8 @@ import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.commons.lang3.reflect.MethodUtils; import java.lang.reflect.*; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * ProxyUtil @@ -34,6 +36,11 @@ public class ProxyUtil { private static final String SPRING_SINGLETONTARGETSOURCE_CLASS_NAME = "org.springframework.aop.target.SingletonTargetSource"; private static final String SPRING_TARGETCLASSAWARE_CLASS_NAME = "org.springframework.aop.TargetClassAware"; + private static final Map, Boolean> isProxyCache = + new ConcurrentHashMap<>(256); + private static final Map isProxyMemberCache = + new ConcurrentHashMap<>(256); + /** * Determine the ultimate target class of the given instance, traversing * not only a top-level proxy but any number of nested proxies as well — @@ -59,7 +66,16 @@ public class ProxyUtil { * @param object the object to check */ public static boolean isProxy(Object object) { - return isSpringAopProxy(object); + Class clazz = object.getClass(); + Boolean flag = isProxyCache.get(clazz); + if (flag != null) { + return flag; + } + + boolean isProxy = isSpringAopProxy(object); + + isProxyCache.put(clazz, isProxy); + return isProxy; } /** @@ -71,7 +87,15 @@ public class ProxyUtil { if (!isProxy(object)) return false; - return isSpringProxyMember(member); + Boolean flag = isProxyMemberCache.get(member); + if (flag != null) { + return flag; + } + + boolean isProxyMember = isSpringProxyMember(member); + + isProxyMemberCache.put(member, isProxyMember); + return isProxyMember; } /**