@@ -116,6 +116,12 @@ public Class<?> enhance(Class<?> configClass, @Nullable ClassLoader classLoader)
116
116
boolean classLoaderMismatch = (classLoader != null && classLoader != configClass .getClassLoader ());
117
117
if (classLoaderMismatch && classLoader instanceof SmartClassLoader smartClassLoader ) {
118
118
classLoader = smartClassLoader .getOriginalClassLoader ();
119
+ classLoaderMismatch = (classLoader != configClass .getClassLoader ());
120
+ }
121
+ // Use original ClassLoader if config class relies on package visibility
122
+ if (classLoaderMismatch && reliesOnPackageVisibility (configClass )) {
123
+ classLoader = configClass .getClassLoader ();
124
+ classLoaderMismatch = false ;
119
125
}
120
126
Enhancer enhancer = newEnhancer (configClass , classLoader );
121
127
Class <?> enhancedClass = createClass (enhancer , classLoaderMismatch );
@@ -132,6 +138,26 @@ public Class<?> enhance(Class<?> configClass, @Nullable ClassLoader classLoader)
132
138
}
133
139
}
134
140
141
+ /**
142
+ * Checks whether the given config class relies on package visibility,
143
+ * either for the class itself or for any of its {@code @Bean} methods.
144
+ */
145
+ private boolean reliesOnPackageVisibility (Class <?> configSuperClass ) {
146
+ int mod = configSuperClass .getModifiers ();
147
+ if (!Modifier .isPublic (mod ) && !Modifier .isProtected (mod )) {
148
+ return true ;
149
+ }
150
+ for (Method method : ReflectionUtils .getDeclaredMethods (configSuperClass )) {
151
+ if (BeanAnnotationHelper .isBeanAnnotated (method )) {
152
+ mod = method .getModifiers ();
153
+ if (!Modifier .isPublic (mod ) && !Modifier .isProtected (mod )) {
154
+ return true ;
155
+ }
156
+ }
157
+ }
158
+ return false ;
159
+ }
160
+
135
161
/**
136
162
* Creates a new CGLIB {@link Enhancer} instance.
137
163
*/
0 commit comments