Skip to content

Commit 966c7c5

Browse files
authored
Merge pull request #10 from stevenschlansker/blackbird-compat
Add jdk11 compat tests for Blackbird cross-classloader access
2 parents 6fc0e7f + 31d9ad7 commit 966c7c5

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

jdk11-tests/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
<groupId>com.fasterxml.jackson.module</groupId>
1717
<artifactId>jackson-module-afterburner</artifactId>
1818
</dependency>
19+
<dependency>
20+
<groupId>com.fasterxml.jackson.module</groupId>
21+
<artifactId>jackson-module-blackbird</artifactId>
22+
</dependency>
1923

2024
<dependency>
2125
<groupId>com.fasterxml.jackson.dataformat</groupId>
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.fasterxml.jackson.compat11.test.blackbird;
2+
3+
import java.io.ByteArrayOutputStream;
4+
import java.io.InputStream;
5+
import java.lang.reflect.Constructor;
6+
7+
import com.fasterxml.jackson.databind.ObjectMapper;
8+
import com.fasterxml.jackson.module.blackbird.BlackbirdModule;
9+
import org.junit.jupiter.api.Test;
10+
11+
import static org.junit.jupiter.api.Assertions.assertEquals;
12+
13+
public class BlackbirdCompatTest {
14+
15+
private final String resourceName =
16+
(BlackbirdCompatTest.class.getName() + "$Data")
17+
.replace('.', '/').concat(".class");
18+
19+
@Test
20+
public void loadInChildClassloader() throws Exception {
21+
TestLoader loader = new TestLoader(getClass().getClassLoader());
22+
Class<?> clazz = Class.forName(Data.class.getName(), true, loader);
23+
ObjectMapper mapper = new ObjectMapper().registerModule(new BlackbirdModule());
24+
Constructor<?> constructor = clazz.getConstructor(int.class);
25+
Object data = constructor.newInstance(42);
26+
assertEquals("{\"field\":42}", mapper.writeValueAsString(data));
27+
}
28+
29+
public static class Data {
30+
private int field;
31+
32+
public Data(int field) {
33+
this.field = field;
34+
}
35+
36+
public int getField() {
37+
return field;
38+
}
39+
40+
public void setField(int field) {
41+
this.field = field;
42+
}
43+
}
44+
45+
public class TestLoader extends ClassLoader {
46+
public TestLoader(ClassLoader parent) {
47+
super(parent);
48+
}
49+
50+
@Override
51+
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
52+
synchronized (getClassLoadingLock(name)) {
53+
try {
54+
Class<?> clazz;
55+
if (Data.class.getName().equals(name)) {
56+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
57+
InputStream in = getResource(resourceName).openStream();
58+
int i;
59+
while ((i = in.read()) != -1) {
60+
baos.write(i);
61+
}
62+
byte[] bytes = baos.toByteArray();
63+
clazz = defineClass(name, bytes, 0, bytes.length);
64+
} else {
65+
clazz = super.loadClass(name, resolve);
66+
}
67+
if (resolve) {
68+
resolveClass(clazz);
69+
}
70+
return clazz;
71+
} catch (Exception e) {
72+
throw new ClassNotFoundException("Unable to load class", e);
73+
}
74+
}
75+
}
76+
}
77+
}

0 commit comments

Comments
 (0)