From edb149214fd2de6c607b1996c1d5a3d01a0a3a9b Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Mon, 17 Nov 2025 11:38:34 -0500 Subject: [PATCH] Fix JsonView JPMS lookup now loads Lookups from the generated classes in stead of only using jsonb's --- .../jsonb/generator/SimpleComponentWriter.java | 7 +++++++ .../java/io/avaje/jsonb/core/CoreViewBuilder.java | 6 ++---- .../java/io/avaje/jsonb/core/ExtensionLoader.java | 13 ++++++++++++- .../java/io/avaje/jsonb/spi/GeneratedComponent.java | 11 ++++++++++- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/SimpleComponentWriter.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/SimpleComponentWriter.java index df470057..4f37a8cf 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/SimpleComponentWriter.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/SimpleComponentWriter.java @@ -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() { @@ -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)) { diff --git a/jsonb/src/main/java/io/avaje/jsonb/core/CoreViewBuilder.java b/jsonb/src/main/java/io/avaje/jsonb/core/CoreViewBuilder.java index 91abe2d0..55235f0c 100644 --- a/jsonb/src/main/java/io/avaje/jsonb/core/CoreViewBuilder.java +++ b/jsonb/src/main/java/io/avaje/jsonb/core/CoreViewBuilder.java @@ -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 stack = new ArrayDeque<>(); private final ViewDsl viewDsl; private final Names names; @@ -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); } @@ -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); } diff --git a/jsonb/src/main/java/io/avaje/jsonb/core/ExtensionLoader.java b/jsonb/src/main/java/io/avaje/jsonb/core/ExtensionLoader.java index 2cae811e..e6825cab 100644 --- a/jsonb/src/main/java/io/avaje/jsonb/core/ExtensionLoader.java +++ b/jsonb/src/main/java/io/avaje/jsonb/core/ExtensionLoader.java @@ -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; @@ -16,11 +19,15 @@ final class ExtensionLoader { private static final List generatedComponents = new ArrayList<>(); private static final List userComponents = new ArrayList<>(); private static Optional adapterFactory = Optional.empty(); + private static final Lookup LOOKUP = MethodHandles.lookup(); + private static final HashMap 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) { @@ -40,4 +47,8 @@ static List userComponents() { static Optional adapterFactory() { return adapterFactory; } + + static Lookup lookupLookup(Class clazz) { + return LOOKUP_MAP.getOrDefault(clazz.getModule().getName(), LOOKUP); + } } diff --git a/jsonb/src/main/java/io/avaje/jsonb/spi/GeneratedComponent.java b/jsonb/src/main/java/io/avaje/jsonb/spi/GeneratedComponent.java index 7709edc7..c354a639 100644 --- a/jsonb/src/main/java/io/avaje/jsonb/spi/GeneratedComponent.java +++ b/jsonb/src/main/java/io/avaje/jsonb/spi/GeneratedComponent.java @@ -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(); + } +}