@@ -120,18 +120,39 @@ public Object getProxy(@Nullable ClassLoader classLoader) {
120
120
if (logger .isTraceEnabled ()) {
121
121
logger .trace ("Creating JDK dynamic proxy: " + this .advised .getTargetSource ());
122
122
}
123
- if (classLoader == null || classLoader .getParent () == null ) {
124
- // JDK bootstrap loader or platform loader suggested ->
125
- // use higher-level loader which can see Spring infrastructure classes
126
- classLoader = getClass ().getClassLoader ();
127
- }
128
- return Proxy .newProxyInstance (classLoader , this .proxiedInterfaces , this );
123
+ return Proxy .newProxyInstance (determineClassLoader (classLoader ), this .proxiedInterfaces , this );
129
124
}
130
125
131
126
@ SuppressWarnings ("deprecation" )
132
127
@ Override
133
128
public Class <?> getProxyClass (@ Nullable ClassLoader classLoader ) {
134
- return Proxy .getProxyClass (classLoader , this .proxiedInterfaces );
129
+ return Proxy .getProxyClass (determineClassLoader (classLoader ), this .proxiedInterfaces );
130
+ }
131
+
132
+ /**
133
+ * Determine whether the JDK bootstrap or platform loader has been suggested ->
134
+ * use higher-level loader which can see Spring infrastructure classes instead.
135
+ */
136
+ private ClassLoader determineClassLoader (@ Nullable ClassLoader classLoader ) {
137
+ if (classLoader == null ) {
138
+ // JDK bootstrap loader -> use spring-aop ClassLoader instead.
139
+ return getClass ().getClassLoader ();
140
+ }
141
+ if (classLoader .getParent () == null ) {
142
+ // Potentially the JDK platform loader on JDK 9+
143
+ ClassLoader aopClassLoader = getClass ().getClassLoader ();
144
+ ClassLoader aopParent = aopClassLoader .getParent ();
145
+ while (aopParent != null ) {
146
+ if (classLoader == aopParent ) {
147
+ // Suggested ClassLoader is ancestor of spring-aop ClassLoader
148
+ // -> use spring-aop ClassLoader itself instead.
149
+ return aopClassLoader ;
150
+ }
151
+ aopParent = aopParent .getParent ();
152
+ }
153
+ }
154
+ // Regular case: use suggested ClassLoader as-is.
155
+ return classLoader ;
135
156
}
136
157
137
158
/**
0 commit comments