2 changed files with 97 additions and 1 deletions
@ -0,0 +1,87 @@
@@ -0,0 +1,87 @@
|
||||
/* |
||||
* Copyright 2002-2024 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.context.annotation; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.security.SecureClassLoader; |
||||
|
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
import org.springframework.core.SmartClassLoader; |
||||
import org.springframework.util.StreamUtils; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* @author Phillip Webb |
||||
* @author Juergen Hoeller |
||||
*/ |
||||
class ConfigurationClassEnhancerTests { |
||||
|
||||
@Test |
||||
void enhanceReloadedClass() throws Exception { |
||||
ConfigurationClassEnhancer configurationClassEnhancer = new ConfigurationClassEnhancer(); |
||||
ClassLoader parentClassLoader = getClass().getClassLoader(); |
||||
CustomClassLoader classLoader = new CustomClassLoader(parentClassLoader); |
||||
Class<?> myClass = parentClassLoader.loadClass(MyConfig.class.getName()); |
||||
configurationClassEnhancer.enhance(myClass, parentClassLoader); |
||||
Class<?> myReloadedClass = classLoader.loadClass(MyConfig.class.getName()); |
||||
Class<?> enhancedReloadedClass = configurationClassEnhancer.enhance(myReloadedClass, classLoader); |
||||
assertThat(enhancedReloadedClass.getClassLoader()).isEqualTo(classLoader); |
||||
} |
||||
|
||||
|
||||
@Configuration |
||||
static class MyConfig { |
||||
|
||||
@Bean |
||||
public String myBean() { |
||||
return "bean"; |
||||
} |
||||
} |
||||
|
||||
|
||||
static class CustomClassLoader extends SecureClassLoader implements SmartClassLoader { |
||||
|
||||
CustomClassLoader(ClassLoader parent) { |
||||
super(parent); |
||||
} |
||||
|
||||
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { |
||||
if (name.contains("MyConfig")) { |
||||
String path = name.replace('.', '/').concat(".class"); |
||||
try (InputStream in = super.getResourceAsStream(path)) { |
||||
byte[] bytes = StreamUtils.copyToByteArray(in); |
||||
if (bytes.length > 0) { |
||||
return defineClass(name, bytes, 0, bytes.length); |
||||
} |
||||
} |
||||
catch (IOException ex) { |
||||
throw new IllegalStateException(ex); |
||||
} |
||||
} |
||||
return super.loadClass(name, resolve); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isClassReloadable(Class<?> clazz) { |
||||
return clazz.getName().contains("MyConfig"); |
||||
} |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue