Skip to content

Commit 327eec0

Browse files
committed
Allow TestCompiler DynamicClassLoader to resolve '.class' resources
Update `DynamicClassLoader` so that `findResource(...)` also considered compiled class bytecode. Closes gh-29347
1 parent d17cdf9 commit 327eec0

File tree

2 files changed

+30
-10
lines changed

2 files changed

+30
-10
lines changed

spring-core-test/src/main/java/org/springframework/core/test/tools/DynamicClassLoader.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
import org.springframework.lang.Nullable;
3333
import org.springframework.util.Assert;
34+
import org.springframework.util.ClassUtils;
3435
import org.springframework.util.ReflectionUtils;
3536

3637
/**
@@ -91,15 +92,7 @@ protected Class<?> findClass(String name) throws ClassNotFoundException {
9192
return super.findClass(name);
9293
}
9394

94-
@Nullable
95-
private byte[] findClassBytes(String name) {
96-
ClassFile classFile = this.classFiles.get(name);
97-
if (classFile != null) {
98-
return classFile.getContent();
99-
}
100-
DynamicClassFileObject dynamicClassFile = this.dynamicClassFiles.get(name);
101-
return (dynamicClassFile != null) ? dynamicClassFile.getBytes() : null;
102-
}
95+
10396

10497
private Class<?> defineClass(String name, byte[] bytes) {
10598
if (this.defineClassMethod != null) {
@@ -109,7 +102,6 @@ private Class<?> defineClass(String name, byte[] bytes) {
109102
return defineClass(name, bytes, 0, bytes.length);
110103
}
111104

112-
113105
@Override
114106
protected Enumeration<URL> findResources(String name) throws IOException {
115107
URL resource = findResource(name);
@@ -122,6 +114,14 @@ protected Enumeration<URL> findResources(String name) throws IOException {
122114
@Override
123115
@Nullable
124116
protected URL findResource(String name) {
117+
if (name.endsWith(ClassUtils.CLASS_FILE_SUFFIX)) {
118+
String className = ClassUtils.convertResourcePathToClassName(name.substring(0,
119+
name.length() - ClassUtils.CLASS_FILE_SUFFIX.length()));
120+
byte[] classBytes = findClassBytes(className);
121+
if (classBytes != null) {
122+
return createResourceUrl(name, () -> classBytes);
123+
}
124+
}
125125
ResourceFile resourceFile = this.resourceFiles.get(name);
126126
if (resourceFile != null) {
127127
return createResourceUrl(resourceFile.getPath(), resourceFile::getBytes);
@@ -133,6 +133,16 @@ protected URL findResource(String name) {
133133
return super.findResource(name);
134134
}
135135

136+
@Nullable
137+
private byte[] findClassBytes(String name) {
138+
ClassFile classFile = this.classFiles.get(name);
139+
if (classFile != null) {
140+
return classFile.getContent();
141+
}
142+
DynamicClassFileObject dynamicClassFile = this.dynamicClassFiles.get(name);
143+
return (dynamicClassFile != null) ? dynamicClassFile.getBytes() : null;
144+
}
145+
136146
private URL createResourceUrl(String name, Supplier<byte[]> bytesSupplier) {
137147
try {
138148
return new URL(null, "resource:///" + name,

spring-core-test/src/test/java/org/springframework/core/test/tools/TestCompilerTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.core.test.tools;
1818

19+
import java.io.InputStream;
1920
import java.util.ArrayList;
2021
import java.util.List;
2122
import java.util.Set;
@@ -278,6 +279,15 @@ public String perform() {
278279
compiled.getInstance(PublicInterface.class, "com.example.Test").perform()).isEqualTo("Hello from subpackage"));
279280
}
280281

282+
@Test
283+
void getResourceForCompiledBytecode() {
284+
SourceFile sourceFile = SourceFile.of(HELLO_WORLD);
285+
TestCompiler.forSystem().compile(sourceFile, compiled -> {
286+
InputStream stream = compiled.getClassLoader().getResourceAsStream("com/example/Hello.class");
287+
assertThat(stream).isNotNull();
288+
});
289+
}
290+
281291
private void assertSuppliesHelloWorld(Compiled compiled) {
282292
assertThat(compiled.getInstance(Supplier.class).get()).isEqualTo("Hello World!");
283293
}

0 commit comments

Comments
 (0)