@@ -116,6 +116,12 @@ public Class<?> enhance(Class<?> configClass, @Nullable ClassLoader classLoader)
116116 boolean classLoaderMismatch = (classLoader != null && classLoader != configClass .getClassLoader ());
117117 if (classLoaderMismatch && classLoader instanceof SmartClassLoader smartClassLoader ) {
118118 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 ;
119125 }
120126 Enhancer enhancer = newEnhancer (configClass , classLoader );
121127 Class <?> enhancedClass = createClass (enhancer , classLoaderMismatch );
@@ -132,6 +138,26 @@ public Class<?> enhance(Class<?> configClass, @Nullable ClassLoader classLoader)
132138 }
133139 }
134140
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+
135161 /**
136162 * Creates a new CGLIB {@link Enhancer} instance.
137163 */
0 commit comments