Explicitly use original ClassLoader in case of package visibility
	
		
			
	
		
	
	
		
			
				
	
				Backport Bot / build (push) Waiting to run
				
					Details
				
			
		
			
				
	
				Build and Deploy Snapshot / Build and Deploy Snapshot (push) Waiting to run
				
					Details
				
			
		
			
				
	
				Build and Deploy Snapshot / Verify (push) Blocked by required conditions
				
					Details
				
			
		
			
				
	
				CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:17], map[id:ubuntu-latest name:Linux]) (push) Waiting to run
				
					Details
				
			
		
			
				
	
				CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:ubuntu-latest name:Linux]) (push) Waiting to run
				
					Details
				
			
		
			
				
	
				CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:23], map[id:ubuntu-latest name:Linux]) (push) Waiting to run
				
					Details
				
			
		
			
				
	
				Deploy Docs / Dispatch docs deployment (push) Waiting to run
				
					Details
				
			
		
	
				
					
				
			
				
	
				Backport Bot / build (push) Waiting to run
				
					Details
				
			
		
			
				
	
				Build and Deploy Snapshot / Build and Deploy Snapshot (push) Waiting to run
				
					Details
				
			
		
			
				
	
				Build and Deploy Snapshot / Verify (push) Blocked by required conditions
				
					Details
				
			
		
			
				
	
				CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:17], map[id:ubuntu-latest name:Linux]) (push) Waiting to run
				
					Details
				
			
		
			
				
	
				CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:ubuntu-latest name:Linux]) (push) Waiting to run
				
					Details
				
			
		
			
				
	
				CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:23], map[id:ubuntu-latest name:Linux]) (push) Waiting to run
				
					Details
				
			
		
			
				
	
				Deploy Docs / Dispatch docs deployment (push) Waiting to run
				
					Details
				
			
		
	Closes gh-34684
This commit is contained in:
		
							parent
							
								
									a946fe2bf8
								
							
						
					
					
						commit
						6bb964e2d0
					
				|  | @ -116,6 +116,12 @@ class ConfigurationClassEnhancer { | ||||||
| 			boolean classLoaderMismatch = (classLoader != null && classLoader != configClass.getClassLoader()); | 			boolean classLoaderMismatch = (classLoader != null && classLoader != configClass.getClassLoader()); | ||||||
| 			if (classLoaderMismatch && classLoader instanceof SmartClassLoader smartClassLoader) { | 			if (classLoaderMismatch && classLoader instanceof SmartClassLoader smartClassLoader) { | ||||||
| 				classLoader = smartClassLoader.getOriginalClassLoader(); | 				classLoader = smartClassLoader.getOriginalClassLoader(); | ||||||
|  | 				classLoaderMismatch = (classLoader != configClass.getClassLoader()); | ||||||
|  | 			} | ||||||
|  | 			// Use original ClassLoader if config class relies on package visibility | ||||||
|  | 			if (classLoaderMismatch && reliesOnPackageVisibility(configClass)) { | ||||||
|  | 				classLoader = configClass.getClassLoader(); | ||||||
|  | 				classLoaderMismatch = false; | ||||||
| 			} | 			} | ||||||
| 			Enhancer enhancer = newEnhancer(configClass, classLoader); | 			Enhancer enhancer = newEnhancer(configClass, classLoader); | ||||||
| 			Class<?> enhancedClass = createClass(enhancer, classLoaderMismatch); | 			Class<?> enhancedClass = createClass(enhancer, classLoaderMismatch); | ||||||
|  | @ -132,6 +138,26 @@ class ConfigurationClassEnhancer { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Checks whether the given config class relies on package visibility, | ||||||
|  | 	 * either for the class itself or for any of its {@code @Bean} methods. | ||||||
|  | 	 */ | ||||||
|  | 	private boolean reliesOnPackageVisibility(Class<?> configSuperClass) { | ||||||
|  | 		int mod = configSuperClass.getModifiers(); | ||||||
|  | 		if (!Modifier.isPublic(mod) && !Modifier.isProtected(mod)) { | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		for (Method method : ReflectionUtils.getDeclaredMethods(configSuperClass)) { | ||||||
|  | 			if (BeanAnnotationHelper.isBeanAnnotated(method)) { | ||||||
|  | 				mod = method.getModifiers(); | ||||||
|  | 				if (!Modifier.isPublic(mod) && !Modifier.isProtected(mod)) { | ||||||
|  | 					return true; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Creates a new CGLIB {@link Enhancer} instance. | 	 * Creates a new CGLIB {@link Enhancer} instance. | ||||||
| 	 */ | 	 */ | ||||||
|  |  | ||||||
|  | @ -111,7 +111,7 @@ class ConfigurationClassEnhancerTests { | ||||||
| 		ClassLoader classLoader = new URLClassLoader(new URL[0], getClass().getClassLoader()); | 		ClassLoader classLoader = new URLClassLoader(new URL[0], getClass().getClassLoader()); | ||||||
| 		Class<?> enhancedClass = configurationClassEnhancer.enhance(MyConfigWithNonPublicMethod.class, classLoader); | 		Class<?> enhancedClass = configurationClassEnhancer.enhance(MyConfigWithNonPublicMethod.class, classLoader); | ||||||
| 		assertThat(MyConfigWithNonPublicMethod.class).isAssignableFrom(enhancedClass); | 		assertThat(MyConfigWithNonPublicMethod.class).isAssignableFrom(enhancedClass); | ||||||
| 		assertThat(enhancedClass.getClassLoader()).isEqualTo(classLoader); | 		assertThat(enhancedClass.getClassLoader()).isEqualTo(classLoader.getParent()); | ||||||
| 
 | 
 | ||||||
| 		classLoader = new OverridingClassLoader(getClass().getClassLoader()); | 		classLoader = new OverridingClassLoader(getClass().getClassLoader()); | ||||||
| 		enhancedClass = configurationClassEnhancer.enhance(MyConfigWithNonPublicMethod.class, classLoader); | 		enhancedClass = configurationClassEnhancer.enhance(MyConfigWithNonPublicMethod.class, classLoader); | ||||||
|  | @ -126,7 +126,7 @@ class ConfigurationClassEnhancerTests { | ||||||
| 		classLoader = new BasicSmartClassLoader(getClass().getClassLoader()); | 		classLoader = new BasicSmartClassLoader(getClass().getClassLoader()); | ||||||
| 		enhancedClass = configurationClassEnhancer.enhance(MyConfigWithNonPublicMethod.class, classLoader); | 		enhancedClass = configurationClassEnhancer.enhance(MyConfigWithNonPublicMethod.class, classLoader); | ||||||
| 		assertThat(MyConfigWithNonPublicMethod.class).isAssignableFrom(enhancedClass); | 		assertThat(MyConfigWithNonPublicMethod.class).isAssignableFrom(enhancedClass); | ||||||
| 		assertThat(enhancedClass.getClassLoader()).isEqualTo(classLoader); | 		assertThat(enhancedClass.getClassLoader()).isEqualTo(classLoader.getParent()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue