Skip to content

Commit 6478815

Browse files
committed
WW-4805 Improves ProxyUtil performance via caching
1 parent 7987c38 commit 6478815

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

core/src/main/java/com/opensymphony/xwork2/util/ProxyUtil.java

+26-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.apache.commons.lang3.reflect.MethodUtils;
2121

2222
import java.lang.reflect.*;
23+
import java.util.Map;
24+
import java.util.concurrent.ConcurrentHashMap;
2325

2426
/**
2527
* <code>ProxyUtil</code>
@@ -34,6 +36,11 @@ public class ProxyUtil {
3436
private static final String SPRING_SINGLETONTARGETSOURCE_CLASS_NAME = "org.springframework.aop.target.SingletonTargetSource";
3537
private static final String SPRING_TARGETCLASSAWARE_CLASS_NAME = "org.springframework.aop.TargetClassAware";
3638

39+
private static final Map<Class<?>, Boolean> isProxyCache =
40+
new ConcurrentHashMap<>(256);
41+
private static final Map<Member, Boolean> isProxyMemberCache =
42+
new ConcurrentHashMap<>(256);
43+
3744
/**
3845
* Determine the ultimate target class of the given instance, traversing
3946
* not only a top-level proxy but any number of nested proxies as well &mdash;
@@ -59,7 +66,16 @@ public static Class<?> ultimateTargetClass(Object candidate) {
5966
* @param object the object to check
6067
*/
6168
public static boolean isProxy(Object object) {
62-
return isSpringAopProxy(object);
69+
Class<?> clazz = object.getClass();
70+
Boolean flag = isProxyCache.get(clazz);
71+
if (flag != null) {
72+
return flag;
73+
}
74+
75+
boolean isProxy = isSpringAopProxy(object);
76+
77+
isProxyCache.put(clazz, isProxy);
78+
return isProxy;
6379
}
6480

6581
/**
@@ -71,7 +87,15 @@ public static boolean isProxyMember(Member member, Object object) {
7187
if (!isProxy(object))
7288
return false;
7389

74-
return isSpringProxyMember(member);
90+
Boolean flag = isProxyMemberCache.get(member);
91+
if (flag != null) {
92+
return flag;
93+
}
94+
95+
boolean isProxyMember = isSpringProxyMember(member);
96+
97+
isProxyMemberCache.put(member, isProxyMember);
98+
return isProxyMember;
7599
}
76100

77101
/**

0 commit comments

Comments
 (0)