Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ private void writeRegister() {
writer.append(" builder.add(%s.class, %s::new);", typeName, adapterShortName).eol();
}
writer.append(" }").eol().eol();
writer.append(" @Override").eol();
writer.append(" public Lookup lookup() {").eol();
writer.append(" return MethodHandles.lookup();").eol();
writer.append(" }").eol().eol();

}

private void writeClassEnd() {
Expand Down Expand Up @@ -107,6 +112,8 @@ private void writeImports() {
importTypes.add("io.avaje.jsonb.spi.Generated");
importTypes.add("io.avaje.jsonb.spi.GeneratedComponent");
importTypes.add("io.avaje.jsonb.spi.MetaData");
importTypes.add("java.lang.invoke.MethodHandles");
importTypes.add("java.lang.invoke.MethodHandles.Lookup");

for (final String importType : importTypes) {
if (Util.validImportType(importType, packageName)) {
Expand Down
6 changes: 2 additions & 4 deletions jsonb/src/main/java/io/avaje/jsonb/core/CoreViewBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,12 @@
import java.io.OutputStream;
import java.io.Writer;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Field;
import java.util.*;

final class CoreViewBuilder implements ViewBuilder {

private final MethodHandles.Lookup lookup = MethodHandles.lookup();
private final Deque<Items> stack = new ArrayDeque<>();
private final ViewDsl viewDsl;
private final Names names;
Expand All @@ -36,7 +34,7 @@ private CoreViewBuilder(ViewDsl viewDsl, Names names) {
@Override
public MethodHandle method(Class<?> cls, String methodName, Class<?> returnType) {
try {
return lookup.findVirtual(cls, methodName, MethodType.methodType(returnType));
return ExtensionLoader.lookupLookup(cls).findVirtual(cls, methodName, MethodType.methodType(returnType));
} catch (Exception e) {
throw new JsonException(e);
}
Expand All @@ -46,7 +44,7 @@ public MethodHandle method(Class<?> cls, String methodName, Class<?> returnType)
public MethodHandle field(Class<?> cls, String name) {
try {
Field field = cls.getDeclaredField(name);
return lookup.unreflectGetter(field);
return ExtensionLoader.lookupLookup(cls).unreflectGetter(field);
} catch (Exception e) {
throw new JsonException(e);
}
Expand Down
13 changes: 12 additions & 1 deletion jsonb/src/main/java/io/avaje/jsonb/core/ExtensionLoader.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package io.avaje.jsonb.core;

import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodHandles.Lookup;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.ServiceLoader;
Expand All @@ -16,11 +19,15 @@ final class ExtensionLoader {
private static final List<GeneratedComponent> generatedComponents = new ArrayList<>();
private static final List<JsonbComponent> userComponents = new ArrayList<>();
private static Optional<JsonStreamFactory> adapterFactory = Optional.empty();
private static final Lookup LOOKUP = MethodHandles.lookup();
private static final HashMap<String, Lookup> LOOKUP_MAP = new HashMap<>();

static void init(ClassLoader classLoader) {
for (var spi : ServiceLoader.load(JsonbExtension.class, classLoader)) {
if (spi instanceof GeneratedComponent) {
generatedComponents.add((GeneratedComponent) spi);
var gen = (GeneratedComponent) spi;
generatedComponents.add(gen);
LOOKUP_MAP.computeIfAbsent(gen.getClass().getModule().getName(), k -> gen.lookup());
} else if (spi instanceof JsonbComponent) {
userComponents.add((JsonbComponent) spi);
} else if (spi instanceof JsonStreamFactory) {
Expand All @@ -40,4 +47,8 @@ static List<JsonbComponent> userComponents() {
static Optional<JsonStreamFactory> adapterFactory() {
return adapterFactory;
}

static Lookup lookupLookup(Class<?> clazz) {
return LOOKUP_MAP.getOrDefault(clazz.getModule().getName(), LOOKUP);
}
}
11 changes: 10 additions & 1 deletion jsonb/src/main/java/io/avaje/jsonb/spi/GeneratedComponent.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
package io.avaje.jsonb.spi;

import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodHandles.Lookup;

/** Component interface registers generated JsonAdapters to the Jsonb.Builder */
@FunctionalInterface
public interface GeneratedComponent extends JsonbComponent, JsonbExtension {}
public interface GeneratedComponent extends JsonbComponent, JsonbExtension {

/** Method handle Lookup for Json Views */
default Lookup lookup() {
return MethodHandles.lookup();
}
}