20
20
import org .apache .commons .lang3 .reflect .MethodUtils ;
21
21
22
22
import java .lang .reflect .*;
23
+ import java .util .Map ;
24
+ import java .util .concurrent .ConcurrentHashMap ;
23
25
24
26
/**
25
27
* <code>ProxyUtil</code>
@@ -34,6 +36,11 @@ public class ProxyUtil {
34
36
private static final String SPRING_SINGLETONTARGETSOURCE_CLASS_NAME = "org.springframework.aop.target.SingletonTargetSource" ;
35
37
private static final String SPRING_TARGETCLASSAWARE_CLASS_NAME = "org.springframework.aop.TargetClassAware" ;
36
38
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
+
37
44
/**
38
45
* Determine the ultimate target class of the given instance, traversing
39
46
* not only a top-level proxy but any number of nested proxies as well —
@@ -59,7 +66,16 @@ public static Class<?> ultimateTargetClass(Object candidate) {
59
66
* @param object the object to check
60
67
*/
61
68
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 ;
63
79
}
64
80
65
81
/**
@@ -71,7 +87,15 @@ public static boolean isProxyMember(Member member, Object object) {
71
87
if (!isProxy (object ))
72
88
return false ;
73
89
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 ;
75
99
}
76
100
77
101
/**
0 commit comments