Skip to content

Commit be10f79

Browse files
authored
Fix JsonView JPMS lookup (#451)
now loads Lookups from the generated classes in stead of only using jsonb's
1 parent e4b5aa5 commit be10f79

File tree

4 files changed

+31
-6
lines changed

4 files changed

+31
-6
lines changed

jsonb-generator/src/main/java/io/avaje/jsonb/generator/SimpleComponentWriter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ private void writeRegister() {
6767
writer.append(" builder.add(%s.class, %s::new);", typeName, adapterShortName).eol();
6868
}
6969
writer.append(" }").eol().eol();
70+
writer.append(" @Override").eol();
71+
writer.append(" public Lookup lookup() {").eol();
72+
writer.append(" return MethodHandles.lookup();").eol();
73+
writer.append(" }").eol().eol();
74+
7075
}
7176

7277
private void writeClassEnd() {
@@ -107,6 +112,8 @@ private void writeImports() {
107112
importTypes.add("io.avaje.jsonb.spi.Generated");
108113
importTypes.add("io.avaje.jsonb.spi.GeneratedComponent");
109114
importTypes.add("io.avaje.jsonb.spi.MetaData");
115+
importTypes.add("java.lang.invoke.MethodHandles");
116+
importTypes.add("java.lang.invoke.MethodHandles.Lookup");
110117

111118
for (final String importType : importTypes) {
112119
if (Util.validImportType(importType, packageName)) {

jsonb/src/main/java/io/avaje/jsonb/core/CoreViewBuilder.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,12 @@
99
import java.io.OutputStream;
1010
import java.io.Writer;
1111
import java.lang.invoke.MethodHandle;
12-
import java.lang.invoke.MethodHandles;
1312
import java.lang.invoke.MethodType;
1413
import java.lang.reflect.Field;
1514
import java.util.*;
1615

1716
final class CoreViewBuilder implements ViewBuilder {
1817

19-
private final MethodHandles.Lookup lookup = MethodHandles.lookup();
2018
private final Deque<Items> stack = new ArrayDeque<>();
2119
private final ViewDsl viewDsl;
2220
private final Names names;
@@ -36,7 +34,7 @@ private CoreViewBuilder(ViewDsl viewDsl, Names names) {
3634
@Override
3735
public MethodHandle method(Class<?> cls, String methodName, Class<?> returnType) {
3836
try {
39-
return lookup.findVirtual(cls, methodName, MethodType.methodType(returnType));
37+
return ExtensionLoader.lookupLookup(cls).findVirtual(cls, methodName, MethodType.methodType(returnType));
4038
} catch (Exception e) {
4139
throw new JsonException(e);
4240
}
@@ -46,7 +44,7 @@ public MethodHandle method(Class<?> cls, String methodName, Class<?> returnType)
4644
public MethodHandle field(Class<?> cls, String name) {
4745
try {
4846
Field field = cls.getDeclaredField(name);
49-
return lookup.unreflectGetter(field);
47+
return ExtensionLoader.lookupLookup(cls).unreflectGetter(field);
5048
} catch (Exception e) {
5149
throw new JsonException(e);
5250
}

jsonb/src/main/java/io/avaje/jsonb/core/ExtensionLoader.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package io.avaje.jsonb.core;
22

3+
import java.lang.invoke.MethodHandles;
4+
import java.lang.invoke.MethodHandles.Lookup;
35
import java.util.ArrayList;
6+
import java.util.HashMap;
47
import java.util.List;
58
import java.util.Optional;
69
import java.util.ServiceLoader;
@@ -16,11 +19,15 @@ final class ExtensionLoader {
1619
private static final List<GeneratedComponent> generatedComponents = new ArrayList<>();
1720
private static final List<JsonbComponent> userComponents = new ArrayList<>();
1821
private static Optional<JsonStreamFactory> adapterFactory = Optional.empty();
22+
private static final Lookup LOOKUP = MethodHandles.lookup();
23+
private static final HashMap<String, Lookup> LOOKUP_MAP = new HashMap<>();
1924

2025
static void init(ClassLoader classLoader) {
2126
for (var spi : ServiceLoader.load(JsonbExtension.class, classLoader)) {
2227
if (spi instanceof GeneratedComponent) {
23-
generatedComponents.add((GeneratedComponent) spi);
28+
var gen = (GeneratedComponent) spi;
29+
generatedComponents.add(gen);
30+
LOOKUP_MAP.computeIfAbsent(gen.getClass().getModule().getName(), k -> gen.lookup());
2431
} else if (spi instanceof JsonbComponent) {
2532
userComponents.add((JsonbComponent) spi);
2633
} else if (spi instanceof JsonStreamFactory) {
@@ -40,4 +47,8 @@ static List<JsonbComponent> userComponents() {
4047
static Optional<JsonStreamFactory> adapterFactory() {
4148
return adapterFactory;
4249
}
50+
51+
static Lookup lookupLookup(Class<?> clazz) {
52+
return LOOKUP_MAP.getOrDefault(clazz.getModule().getName(), LOOKUP);
53+
}
4354
}
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
package io.avaje.jsonb.spi;
22

3+
import java.lang.invoke.MethodHandles;
4+
import java.lang.invoke.MethodHandles.Lookup;
5+
36
/** Component interface registers generated JsonAdapters to the Jsonb.Builder */
47
@FunctionalInterface
5-
public interface GeneratedComponent extends JsonbComponent, JsonbExtension {}
8+
public interface GeneratedComponent extends JsonbComponent, JsonbExtension {
9+
10+
/** Method handle Lookup for Json Views */
11+
default Lookup lookup() {
12+
return MethodHandles.lookup();
13+
}
14+
}

0 commit comments

Comments
 (0)