diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cec90a08d6..002b66e2c0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -89,11 +89,14 @@ jobs: graalvm: name: GraalVM CI runs-on: ubuntu-latest + strategy: + matrix: + java-version: ["17", "21", "22"] steps: - uses: actions/checkout@v4 - uses: graalvm/setup-graalvm@v1 with: - java-version: "21" + java-version: ${{ matrix.java-version }} distribution: "graalvm" github-token: ${{ secrets.GITHUB_TOKEN }} native-image-job-reports: "true" diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CollectionExample.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CollectionExample.java index 3a53d5f524..222cc4714d 100644 --- a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CollectionExample.java +++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CollectionExample.java @@ -32,7 +32,11 @@ public class CollectionExample { static Fury fury; static { - fury = Fury.builder().requireClassRegistration(true).build(); + fury = + Fury.builder() + .withName(CollectionExample.class.getName()) + .requireClassRegistration(true) + .build(); } static void test(Fury fury) { diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CompatibleExample.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CompatibleExample.java index 060d82f1be..37c92fe6d3 100644 --- a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CompatibleExample.java +++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CompatibleExample.java @@ -26,7 +26,11 @@ public class CompatibleExample { static Fury fury; static { - fury = + fury = createFury(); + } + + private static Fury createFury() { + Fury fury = Fury.builder() .requireClassRegistration(true) .withCompatibleMode(CompatibleMode.COMPATIBLE) @@ -34,9 +38,15 @@ public class CompatibleExample { .build(); // register and generate serializer code. fury.register(Foo.class, true); + return fury; } public static void main(String[] args) { + System.out.println("CompatibleExample started"); + Example.test(fury); + System.out.println("CompatibleExample succeed 1/2"); + // Test new created Fury at runtime + fury = createFury(); Example.test(fury); System.out.println("CompatibleExample succeed"); } diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CompatibleThreadSafeExample.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CompatibleThreadSafeExample.java index 9ddb489238..d7b8c484f9 100644 --- a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CompatibleThreadSafeExample.java +++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/CompatibleThreadSafeExample.java @@ -33,6 +33,7 @@ public class CompatibleThreadSafeExample { classLoader -> { Fury f = Fury.builder() + .withName(CompatibleThreadSafeExample.class.getName()) .requireClassRegistration(true) .withCompatibleMode(CompatibleMode.COMPATIBLE) .build(); diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/Example.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/Example.java index 203c8c2e5e..bf2157429e 100644 --- a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/Example.java +++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/Example.java @@ -28,7 +28,7 @@ public class Example { static Fury fury; static { - fury = Fury.builder().requireClassRegistration(true).build(); + fury = Fury.builder().withName(Example.class.getName()).requireClassRegistration(true).build(); // register and generate serializer code. fury.register(Foo.class, true); } diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/Main.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/Main.java index 6b51256b38..b8b6085690 100644 --- a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/Main.java +++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/Main.java @@ -31,6 +31,7 @@ public static void main(String[] args) throws Throwable { RecordExample.main(args); CompatibleRecordExample.main(args); RecordExample2.main(args); + ThreadSafeExample.main(args); CompatibleThreadSafeExample.main(args); ProxyExample.main(args); diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ProxyExample.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ProxyExample.java index 43afc8bcd8..a3a48248c3 100644 --- a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ProxyExample.java +++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ProxyExample.java @@ -39,9 +39,18 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl static Fury fury; static { - fury = Fury.builder().requireClassRegistration(true).build(); + fury = createFury(); + } + + private static Fury createFury() { + Fury fury = + Fury.builder() + .withName(ProxyExample.class.getName()) + .requireClassRegistration(true) + .build(); // register and generate serializer code. fury.register(TestInvocationHandler.class, true); + return fury; } public static void main(String[] args) { @@ -51,6 +60,9 @@ public static void main(String[] args) { fury.getClassLoader(), new Class[] {Function.class}, new TestInvocationHandler()); Function deserializedFunction = (Function) fury.deserialize(fury.serialize(function)); Preconditions.checkArgument(deserializedFunction.apply(null).equals(1)); + fury = createFury(); + deserializedFunction = (Function) fury.deserialize(fury.serialize(function)); + Preconditions.checkArgument(deserializedFunction.apply(null).equals(1)); System.out.println("Proxy tests pass"); } } diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ScopedCompatibleExample.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ScopedCompatibleExample.java index 48883fbe72..1085da0ce2 100644 --- a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ScopedCompatibleExample.java +++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ScopedCompatibleExample.java @@ -23,21 +23,31 @@ import org.apache.fury.config.CompatibleMode; public class ScopedCompatibleExample { - static Fury fury; + private static Fury fury; static { - fury = + fury = createFury(); + } + + private static Fury createFury() { + Fury fury = Fury.builder() + .withName(ScopedCompatibleExample.class.getName()) .requireClassRegistration(true) .withCompatibleMode(CompatibleMode.COMPATIBLE) .withScopedMetaShare(true) .build(); // register and generate serializer code. fury.register(Foo.class, true); + return fury; } public static void main(String[] args) { + System.out.println("ScopedCompatibleExample started"); + Example.test(fury); + System.out.println("ScopedCompatibleExample succeed 1/2"); + fury = createFury(); Example.test(fury); - System.out.println("CompatibleExample succeed"); + System.out.println("ScopedCompatibleExample succeed"); } } diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ThreadSafeExample.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ThreadSafeExample.java index 150dc16e7c..1a0b1125c1 100644 --- a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ThreadSafeExample.java +++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/ThreadSafeExample.java @@ -37,7 +37,11 @@ public class ThreadSafeExample { fury = new ThreadLocalFury( classLoader -> { - Fury f = Fury.builder().requireClassRegistration(true).build(); + Fury f = + Fury.builder() + .withName(ThreadSafeExample.class.getName()) + .requireClassRegistration(true) + .build(); // register and generate serializer code. f.register(Foo.class, true); return f; diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/CompatibleRecordExample.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/CompatibleRecordExample.java index ef4bfc9f12..94e3a7ebc1 100644 --- a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/CompatibleRecordExample.java +++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/CompatibleRecordExample.java @@ -26,16 +26,24 @@ public class CompatibleRecordExample { static Fury fury; static { - fury = + fury = createFury(); + } + + private static Fury createFury() { + Fury fury = Fury.builder() + .withName(CompatibleRecordExample.class.getName()) .requireClassRegistration(true) .withCompatibleMode(CompatibleMode.COMPATIBLE) .build(); // register and generate serializer code. fury.register(RecordExample.Record.class, true); + return fury; } public static void main(String[] args) { + RecordExample.test(fury); + fury = createFury(); RecordExample.test(fury); System.out.println("CompatibleRecordExample succeed"); } diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/RecordExample.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/RecordExample.java index 1202d226b4..90ece86b53 100644 --- a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/RecordExample.java +++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/RecordExample.java @@ -30,9 +30,18 @@ public record Record(int f1, String f2, List f3, Map f4) { static Fury fury; static { - fury = Fury.builder().requireClassRegistration(true).build(); + fury = createFury(); + } + + private static Fury createFury() { + Fury fury = + Fury.builder() + .withName(RecordExample.class.getName()) + .requireClassRegistration(true) + .build(); // register and generate serializer code. fury.register(Record.class, true); + return fury; } static void test(Fury fury) { @@ -45,6 +54,10 @@ static void test(Fury fury) { } public static void main(String[] args) { + System.out.println("RecordExample started"); + test(fury); + System.out.println("RecordExample succeed 1/2"); + fury = createFury(); test(fury); System.out.println("RecordExample succeed"); } diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/RecordExample2.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/RecordExample2.java index 8fa9fa4247..d6f5dd10ce 100644 --- a/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/RecordExample2.java +++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fury/graalvm/record/RecordExample2.java @@ -30,13 +30,22 @@ private record Record(int f1, String f2, List f3, Map f4) static Fury fury; static { - fury = Fury.builder().requireClassRegistration(true).build(); + fury = createFury(); + } + + private static Fury createFury() { + Fury fury = + Fury.builder() + .withName(RecordExample2.class.getName()) + .requireClassRegistration(true) + .build(); // register and generate serializer code. fury.register(Record.class, true); fury.register(Foo.class, true); + return fury; } - public static void main(String[] args) { + public static void test(Fury fury) { Record record = new Record(10, "abc", List.of("str1", "str2"), Map.of("k1", 10L, "k2", 20L)); byte[] bytes = fury.serialize(record); Object o = fury.deserialize(bytes); @@ -44,6 +53,14 @@ public static void main(String[] args) { Foo foo = new Foo(10, "abc", List.of("str1", "str2"), Map.of("k1", 10L, "k2", 20L)); Object o2 = fury.deserialize(fury.serialize(foo)); Preconditions.checkArgument(foo.equals(o2)); + } + + public static void main(String[] args) { + System.out.println("RecordExample started"); + test(fury); + System.out.println("RecordExample succeed 1/2"); + fury = createFury(); + test(fury); System.out.println("RecordExample2 succeed"); } } diff --git a/integration_tests/graalvm_tests/src/main/resources/META-INF/native-image/org.apache.fury/graalvm_tests/native-image.properties b/integration_tests/graalvm_tests/src/main/resources/META-INF/native-image/org.apache.fury/graalvm_tests/native-image.properties index c01360795a..5af8a7a624 100644 --- a/integration_tests/graalvm_tests/src/main/resources/META-INF/native-image/org.apache.fury/graalvm_tests/native-image.properties +++ b/integration_tests/graalvm_tests/src/main/resources/META-INF/native-image/org.apache.fury/graalvm_tests/native-image.properties @@ -17,13 +17,15 @@ # https://www.graalvm.org/latest/reference-manual/native-image/dynamic-features/Reflection/#unsafe-accesses : # The unsafe offset get on build time may be different from runtime -Args = -H:+ReportExceptionStackTraces \ +Args=-H:+ReportExceptionStackTraces \ --initialize-at-build-time=org.apache.fury.graalvm.Example,\ org.apache.fury.graalvm.CompatibleExample,\ + org.apache.fury.graalvm.ScopedCompatibleExample,\ org.apache.fury.graalvm.record.RecordExample,\ org.apache.fury.graalvm.record.CompatibleRecordExample,\ org.apache.fury.graalvm.record.RecordExample2,\ org.apache.fury.graalvm.ThreadSafeExample,\ org.apache.fury.graalvm.CompatibleThreadSafeExample,\ org.apache.fury.graalvm.ProxyExample,\ + org.apache.fury.graalvm.CollectionExample,\ org.apache.fury.graalvm.Benchmark diff --git a/java/fury-core/src/main/java/org/apache/fury/ThreadLocalFury.java b/java/fury-core/src/main/java/org/apache/fury/ThreadLocalFury.java index e4fae2ae74..d742650d94 100644 --- a/java/fury-core/src/main/java/org/apache/fury/ThreadLocalFury.java +++ b/java/fury-core/src/main/java/org/apache/fury/ThreadLocalFury.java @@ -29,7 +29,6 @@ import org.apache.fury.io.FuryReadableChannel; import org.apache.fury.memory.MemoryBuffer; import org.apache.fury.memory.MemoryUtils; -import org.apache.fury.resolver.ClassResolver; import org.apache.fury.serializer.BufferCallback; import org.apache.fury.util.LoaderBinding; import org.apache.fury.util.LoaderBinding.StagingType; @@ -65,8 +64,6 @@ public ThreadLocalFury(Function furyFactory) { // in a process load some classes which is not cheap. // 2. Make fury generate code at graalvm build time. Fury fury = bindingThreadLocal.get().get(); - ClassResolver._addGraalvmClassRegistry( - fury.getConfig().getConfigHash(), fury.getClassResolver()); } @Override diff --git a/java/fury-core/src/main/java/org/apache/fury/config/Config.java b/java/fury-core/src/main/java/org/apache/fury/config/Config.java index fad9d3957d..98422d7372 100644 --- a/java/fury-core/src/main/java/org/apache/fury/config/Config.java +++ b/java/fury-core/src/main/java/org/apache/fury/config/Config.java @@ -33,6 +33,7 @@ /** Config for fury, all {@link Fury} related config can be found here. */ @SuppressWarnings({"rawtypes"}) public class Config implements Serializable { + private final String name; private final Language language; private final boolean trackingRef; private final boolean basicTypesRefIgnored; @@ -61,6 +62,7 @@ public class Config implements Serializable { private final boolean deserializeNonexistentEnumValueAsNull; public Config(FuryBuilder builder) { + name = builder.name; language = builder.language; trackingRef = builder.trackingRef; basicTypesRefIgnored = !trackingRef || builder.basicTypesRefIgnored; @@ -93,6 +95,11 @@ public Config(FuryBuilder builder) { deserializeNonexistentEnumValueAsNull = builder.deserializeNonexistentEnumValueAsNull; } + /** Returns the name for Fury serialization. */ + public String getName() { + return name; + } + public Language getLanguage() { return language; } @@ -257,7 +264,8 @@ public boolean equals(Object o) { return false; } Config config = (Config) o; - return trackingRef == config.trackingRef + return name == config.name + && trackingRef == config.trackingRef && basicTypesRefIgnored == config.basicTypesRefIgnored && stringRefIgnored == config.stringRefIgnored && timeRefIgnored == config.timeRefIgnored @@ -286,6 +294,7 @@ public boolean equals(Object o) { @Override public int hashCode() { return Objects.hash( + name, language, trackingRef, basicTypesRefIgnored, diff --git a/java/fury-core/src/main/java/org/apache/fury/config/FuryBuilder.java b/java/fury-core/src/main/java/org/apache/fury/config/FuryBuilder.java index ebd9fb8bf7..1210c7515d 100644 --- a/java/fury-core/src/main/java/org/apache/fury/config/FuryBuilder.java +++ b/java/fury-core/src/main/java/org/apache/fury/config/FuryBuilder.java @@ -56,6 +56,7 @@ public final class FuryBuilder { ENABLE_CLASS_REGISTRATION_FORCIBLY = "true".equals(flagValue) || "1".equals(flagValue); } + String name; boolean checkClassVersion = false; Language language = Language.JAVA; boolean trackingRef = false; @@ -318,6 +319,12 @@ public FuryBuilder withScalaOptimizationEnabled(boolean enableScalaOptimization) return this; } + /** Set name for Fury serialization. */ + public FuryBuilder withName(String name) { + this.name = name; + return this; + } + private void finish() { if (classLoader == null) { classLoader = Thread.currentThread().getContextClassLoader(); diff --git a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java index 8ee93a3806..1fba168007 100644 --- a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java +++ b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java @@ -266,6 +266,7 @@ public ClassResolver(Fury fury) { extRegistry = new ExtRegistry(); extRegistry.objectGenericType = buildGenericType(OBJECT_TYPE); shimDispatcher = new ShimDispatcher(fury); + ClassResolver._addGraalvmClassRegistry(fury.getConfig().getConfigHash(), this); } public void initialize() { @@ -418,12 +419,24 @@ public void register(Class cls, boolean createSerializer) { register(cls); if (createSerializer) { ClassInfo classInfo = getClassInfo(cls); + ClassInfo deserializationClassInfo; if (metaContextShareEnabled && needToWriteClassDef(classInfo.serializer)) { ClassDef classDef = classInfo.classDef; if (classDef == null) { classDef = buildClassDef(classInfo); } - buildMetaSharedClassInfo(Tuple2.of(classDef, null), classDef); + deserializationClassInfo = buildMetaSharedClassInfo(Tuple2.of(classDef, null), classDef); + if (deserializationClassInfo != null && GraalvmSupport.isGraalBuildtime()) { + getGraalvmClassRegistry() + .deserializerClassMap + .put(classDef.getId(), deserializationClassInfo.serializer.getClass()); + deserializationClassInfo.serializer = null; + } + } + if (GraalvmSupport.isGraalBuildtime()) { + // Instance for generated class should be hold at graalvm runtime only. + getGraalvmClassRegistry().serializerClassMap.put(cls, classInfo.serializer.getClass()); + classInfo.serializer = null; } } } @@ -1356,7 +1369,9 @@ private ClassInfo readClassInfoWithMetaShare(MemoryBuffer buffer, MetaContext me ObjectArray readClassDefs = metaContext.readClassDefs; ClassDef classDef = readClassDefs.get(id); Tuple2 classDefTuple = extRegistry.classIdToDef.get(classDef.getId()); - if (classDefTuple == null || classDefTuple.f1 == null) { + if (classDefTuple == null + || classDefTuple.f1 == null + || classDefTuple.f1.serializer == null) { classInfo = buildMetaSharedClassInfo(classDefTuple, classDef); } else { classInfo = classDefTuple.f1; @@ -1915,33 +1930,54 @@ public Fury getFury() { return fury; } - private static final ConcurrentMap> GRAALVM_REGISTRY = + private static final ConcurrentMap GRAALVM_REGISTRY = new ConcurrentHashMap<>(); // CHECKSTYLE.OFF:MethodName public static void _addGraalvmClassRegistry(int furyConfigHash, ClassResolver classResolver) { // CHECKSTYLE.ON:MethodName if (GraalvmSupport.isGraalBuildtime()) { - List resolvers = - GRAALVM_REGISTRY.computeIfAbsent( - furyConfigHash, k -> Collections.synchronizedList(new ArrayList<>())); - resolvers.add(classResolver); + GraalvmClassRegistry registry = + GRAALVM_REGISTRY.computeIfAbsent(furyConfigHash, k -> new GraalvmClassRegistry()); + registry.resolvers.add(classResolver); + } + } + + private static class GraalvmClassRegistry { + private final List resolvers; + private final Map, Class> serializerClassMap; + private final Map> deserializerClassMap; + + private GraalvmClassRegistry() { + resolvers = Collections.synchronizedList(new ArrayList<>()); + serializerClassMap = new ConcurrentHashMap<>(); + deserializerClassMap = new ConcurrentHashMap<>(); } } + private GraalvmClassRegistry getGraalvmClassRegistry() { + return GRAALVM_REGISTRY.computeIfAbsent( + fury.getConfig().getConfigHash(), k -> new GraalvmClassRegistry()); + } + private Class getSerializerClassFromGraalvmRegistry(Class cls) { - List classResolvers = GRAALVM_REGISTRY.get(fury.getConfig().getConfigHash()); + GraalvmClassRegistry registry = getGraalvmClassRegistry(); + List classResolvers = registry.resolvers; if (classResolvers == null || classResolvers.isEmpty()) { return null; } for (ClassResolver classResolver : classResolvers) { if (classResolver != this) { ClassInfo classInfo = classResolver.classInfoMap.get(cls); - if (classInfo != null) { + if (classInfo != null && classInfo.serializer != null) { return classInfo.serializer.getClass(); } } } + Class serializerClass = registry.serializerClassMap.get(cls); + if (serializerClass != null) { + return serializerClass; + } if (GraalvmSupport.isGraalRuntime()) { if (Functions.isLambda(cls) || ReflectionUtils.isJdkProxy(cls)) { return null; @@ -1953,7 +1989,8 @@ private Class getSerializerClassFromGraalvmRegistry(Class< private Class getMetaSharedDeserializerClassFromGraalvmRegistry( Class cls, ClassDef classDef) { - List classResolvers = GRAALVM_REGISTRY.get(fury.getConfig().getConfigHash()); + GraalvmClassRegistry registry = getGraalvmClassRegistry(); + List classResolvers = registry.resolvers; if (classResolvers == null || classResolvers.isEmpty()) { return null; } @@ -1961,11 +1998,17 @@ private Class getMetaSharedDeserializerClassFromGraalvmReg if (classResolver != this) { Tuple2 tuple2 = classResolver.extRegistry.classIdToDef.get(classDef.getId()); - if (tuple2 != null && tuple2.f1 != null) { + if (tuple2 != null && tuple2.f1 != null && tuple2.f1.serializer != null) { return tuple2.f1.serializer.getClass(); } } } + Class deserializerClass = + registry.deserializerClassMap.get(classDef.getId()); + // noinspection Duplicates + if (deserializerClass != null) { + return deserializerClass; + } if (GraalvmSupport.isGraalRuntime()) { if (Functions.isLambda(cls) || ReflectionUtils.isJdkProxy(cls)) { return null; diff --git a/java/fury-core/src/main/java/org/apache/fury/util/function/Functions.java b/java/fury-core/src/main/java/org/apache/fury/util/function/Functions.java index 3169fb5114..55ca8395ad 100644 --- a/java/fury-core/src/main/java/org/apache/fury/util/function/Functions.java +++ b/java/fury-core/src/main/java/org/apache/fury/util/function/Functions.java @@ -26,9 +26,13 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; import org.apache.fury.collection.Tuple2; import org.apache.fury.reflect.ReflectionUtils; +import org.apache.fury.util.GraalvmSupport; import org.apache.fury.util.Preconditions; import org.apache.fury.util.unsafe._JDKAccess; @@ -73,27 +77,38 @@ public static Object makeGetterFunction(Class cls, String methodName) { } } + private static final Map>, Object> map = + GraalvmSupport.isGraalBuildtime() ? new ConcurrentHashMap<>() : new WeakHashMap<>(); + public static Object makeGetterFunction(Method method) { - MethodHandles.Lookup lookup = _JDKAccess._trustedLookup(method.getDeclaringClass()); - try { - // Why `lookup.findGetter` doesn't work? - // MethodHandle handle = lookup.findGetter(field.getDeclaringClass(), field.getName(), - // field.getType()); - MethodHandle handle = lookup.unreflect(method); - return _JDKAccess.makeGetterFunction(lookup, handle, method.getReturnType()); - } catch (IllegalAccessException ex) { - throw new RuntimeException(ex); - } + return map.computeIfAbsent( + Tuple2.of(method, Object.class), + k -> { + MethodHandles.Lookup lookup = _JDKAccess._trustedLookup(method.getDeclaringClass()); + try { + // Why `lookup.findGetter` doesn't work? + // MethodHandle handle = lookup.findGetter(field.getDeclaringClass(), field.getName(), + // field.getType()); + MethodHandle handle = lookup.unreflect(method); + return _JDKAccess.makeGetterFunction(lookup, handle, method.getReturnType()); + } catch (IllegalAccessException ex) { + throw new RuntimeException(ex); + } + }); } public static Object makeGetterFunction(Method method, Class returnType) { - MethodHandles.Lookup lookup = _JDKAccess._trustedLookup(method.getDeclaringClass()); - try { - MethodHandle handle = lookup.unreflect(method); - return _JDKAccess.makeGetterFunction(lookup, handle, returnType); - } catch (IllegalAccessException ex) { - throw new RuntimeException(ex); - } + return map.computeIfAbsent( + Tuple2.of(method, returnType), + k -> { + MethodHandles.Lookup lookup = _JDKAccess._trustedLookup(method.getDeclaringClass()); + try { + MethodHandle handle = lookup.unreflect(method); + return _JDKAccess.makeGetterFunction(lookup, handle, returnType); + } catch (IllegalAccessException ex) { + throw new RuntimeException(ex); + } + }); } public static Tuple2, String> getterMethodInfo(Class type) { diff --git a/java/fury-core/src/main/resources/META-INF/native-image/org.apache.fury/fury-core/native-image.properties b/java/fury-core/src/main/resources/META-INF/native-image/org.apache.fury/fury-core/native-image.properties index e9d4a67b24..5f3338f5b8 100644 --- a/java/fury-core/src/main/resources/META-INF/native-image/org.apache.fury/fury-core/native-image.properties +++ b/java/fury-core/src/main/resources/META-INF/native-image/org.apache.fury/fury-core/native-image.properties @@ -18,161 +18,758 @@ # https://www.graalvm.org/latest/reference-manual/native-image/dynamic-features/Reflection/#unsafe-accesses : # The unsafe offset get on build time may be different from runtime Args=--initialize-at-build-time=org.apache.fury.memory.MemoryBuffer,\ - org.apache.fury.util.GraalvmSupport,\ - org.apache.fury.serializer.collection.UnmodifiableSerializers$Offset,\ - org.apache.fury.serializer.collection.SynchronizedSerializers$Offset,\ - org.apache.fury.serializer.collection.CollectionSerializers$ArraysAsListSerializer,\ - org.apache.fury.serializer.collection.CollectionSerializers$SetFromMapSerializer,\ - org.apache.fury.serializer.collection.MapSerializers$EnumMapSerializer,\ + com.google.common.base.Equivalence$Equals,\ + com.google.common.base.Equivalence$Identity,\ + com.google.common.base.Equivalence,\ + com.google.common.base.FinalizableReferenceQueue,\ + com.google.common.base.Ticker$1,\ + com.google.common.base.internal.Finalizer,\ + com.google.common.cache.CacheBuilder$1,\ + com.google.common.cache.CacheBuilder$2,\ + com.google.common.cache.CacheBuilder$3,\ + com.google.common.cache.CacheBuilder$NullListener,\ + com.google.common.cache.CacheBuilder$OneWeigher,\ + com.google.common.cache.LocalCache$1,\ + com.google.common.cache.LocalCache$2,\ + com.google.common.cache.LocalCache$EntryFactory$1,\ + com.google.common.cache.LocalCache$EntryFactory$2,\ + com.google.common.cache.LocalCache$EntryFactory$3,\ + com.google.common.cache.LocalCache$EntryFactory$4,\ + com.google.common.cache.LocalCache$EntryFactory$5,\ + com.google.common.cache.LocalCache$EntryFactory$6,\ + com.google.common.cache.LocalCache$EntryFactory$7,\ + com.google.common.cache.LocalCache$EntryFactory$8,\ + com.google.common.cache.LocalCache$EntrySet,\ + com.google.common.cache.LocalCache$LocalManualCache,\ + com.google.common.cache.LocalCache$Segment,\ + com.google.common.cache.LocalCache$SoftValueReference,\ + com.google.common.cache.LocalCache$Strength$1,\ + com.google.common.cache.LocalCache$Strength$2,\ + com.google.common.cache.LocalCache$Strength$3,\ + com.google.common.cache.LocalCache$StrongEntry,\ + com.google.common.cache.LocalCache$StrongValueReference,\ + com.google.common.cache.LocalCache$WeakEntry,\ + com.google.common.cache.LocalCache$WeakValueReference,\ + com.google.common.cache.LocalCache,\ + com.google.common.collect.AbstractIterator$1,\ + com.google.common.collect.ImmutableSortedMap,\ + com.google.common.collect.NaturalOrdering,\ + com.google.common.collect.Platform,\ + com.google.common.collect.RegularImmutableBiMap,\ + com.google.common.collect.RegularImmutableList,\ + com.google.common.collect.RegularImmutableMap,\ + com.google.common.collect.RegularImmutableSet,\ + com.google.common.collect.RegularImmutableSortedSet,\ + com.google.common.collect.SingletonImmutableBiMap,\ + com.google.common.collect.SingletonImmutableList,\ + com.google.common.collect.SingletonImmutableSet,\ + com.google.common.math.IntMath$1,\ + com.google.common.primitives.Primitives,\ + com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper,\ + com.google.common.util.concurrent.SettableFuture,\ + java.io.IOException,\ + java.lang.ArrayIndexOutOfBoundsException,\ + java.lang.Boolean,\ + java.lang.Byte,\ + java.lang.Character,\ + java.lang.Class,\ + java.lang.Double,\ + java.lang.Exception,\ + java.lang.Float,\ + java.lang.IllegalArgumentException,\ + java.lang.IllegalStateException,\ + java.lang.IndexOutOfBoundsException,\ + java.lang.Integer,\ + java.lang.Long,\ + java.lang.NullPointerException,\ + java.lang.Object,\ + java.lang.RuntimeException,\ + java.lang.Short,\ + java.lang.StackTraceElement,\ + java.lang.String,\ + java.lang.StringBuffer,\ + java.lang.StringBuilder,\ + java.lang.Throwable,\ + java.lang.Void,\ + java.math.BigDecimal,\ + java.math.BigInteger,\ + java.net.URI,\ + java.nio.DirectByteBuffer,\ + java.nio.HeapByteBuffer,\ + java.sql.Date,\ + java.sql.Time,\ + java.sql.Timestamp,\ + java.time.Duration,\ + java.time.Instant,\ + java.time.LocalDate,\ + java.time.LocalDateTime,\ + java.time.LocalTime,\ + java.time.MonthDay,\ + java.time.OffsetDateTime,\ + java.time.OffsetTime,\ + java.time.Period,\ + java.time.Year,\ + java.time.YearMonth,\ + java.time.ZoneOffset,\ + java.time.ZonedDateTime,\ + java.util.ArrayDeque,\ + java.util.ArrayList,\ + java.util.Arrays$ArrayList,\ + java.util.BitSet,\ + java.util.Collections$EmptyList,\ + java.util.Collections$EmptyMap,\ + java.util.Collections$EmptySet,\ + java.util.Collections$ReverseComparator,\ + java.util.Collections$SetFromMap,\ + java.util.Collections$SingletonList,\ + java.util.Collections$SingletonMap,\ + java.util.Collections$SingletonSet,\ + java.util.Collections$SynchronizedCollection,\ + java.util.Collections$SynchronizedList,\ + java.util.Collections$SynchronizedMap,\ + java.util.Collections$SynchronizedRandomAccessList,\ + java.util.Collections$SynchronizedSet,\ + java.util.Collections$SynchronizedSortedMap,\ + java.util.Collections$SynchronizedSortedSet,\ + java.util.Collections$UnmodifiableCollection,\ + java.util.Collections$UnmodifiableList,\ + java.util.Collections$UnmodifiableMap,\ + java.util.Collections$UnmodifiableNavigableMap$EmptyNavigableMap,\ + java.util.Collections$UnmodifiableNavigableSet$EmptyNavigableSet,\ + java.util.Collections$UnmodifiableRandomAccessList,\ + java.util.Collections$UnmodifiableSet,\ + java.util.Collections$UnmodifiableSortedMap,\ + java.util.Collections$UnmodifiableSortedSet,\ + java.util.Comparators$NaturalOrderComparator,\ + java.util.Currency,\ + java.util.Date,\ + java.util.EnumMap,\ + java.util.HashMap,\ + java.util.HashSet,\ + java.util.ImmutableCollections$List12,\ + java.util.ImmutableCollections$ListN,\ + java.util.ImmutableCollections$Map1,\ + java.util.ImmutableCollections$MapN,\ + java.util.ImmutableCollections$Set12,\ + java.util.ImmutableCollections$SetN,\ + java.util.ImmutableCollections$SubList,\ + java.util.LinkedHashMap,\ + java.util.LinkedHashSet,\ + java.util.LinkedList,\ + java.util.Locale,\ + java.util.Optional,\ + java.util.OptionalDouble,\ + java.util.OptionalInt,\ + java.util.OptionalLong,\ + java.util.PriorityQueue,\ + java.util.RegularEnumSet,\ + java.util.TreeMap,\ + java.util.TreeSet,\ + java.util.UUID,\ + java.util.Vector,\ + java.util.concurrent.ArrayBlockingQueue,\ + java.util.concurrent.ConcurrentHashMap$KeySetView,\ + java.util.concurrent.ConcurrentHashMap,\ + java.util.concurrent.ConcurrentSkipListMap,\ + java.util.concurrent.ConcurrentSkipListSet,\ + java.util.concurrent.CopyOnWriteArrayList,\ + java.util.concurrent.LinkedBlockingQueue,\ + java.util.concurrent.atomic.AtomicBoolean,\ + java.util.concurrent.atomic.AtomicInteger,\ + java.util.concurrent.atomic.AtomicLong,\ + java.util.concurrent.atomic.AtomicReference,\ + java.util.regex.Pattern,\ + org.apache.fury.Fury,\ + org.apache.fury.ThreadLocalFury,\ + org.apache.fury.builder.AccessorHelper,\ + org.apache.fury.builder.JITContext,\ + org.apache.fury.builder.ObjectCodecBuilder,\ + org.apache.fury.codegen.CodeGenerator$DefineState,\ + org.apache.fury.codegen.CodeGenerator,\ + org.apache.fury.codegen.CodegenContext,\ + org.apache.fury.codegen.CompileState,\ + org.apache.fury.codegen.CompileUnit,\ + org.apache.fury.codegen.Expression$Literal,\ + org.apache.fury.codegen.Expression$Reference,\ + org.apache.fury.codegen.JaninoUtils,\ + org.apache.fury.collection.FuryObjectMap,\ + org.apache.fury.collection.IdentityMap,\ + org.apache.fury.collection.IdentityObjectIntMap,\ + org.apache.fury.collection.IntArray,\ + org.apache.fury.collection.LazyMap,\ + org.apache.fury.collection.LongMap,\ + org.apache.fury.collection.MapStatistics,\ + org.apache.fury.collection.MultiKeyWeakMap,\ + org.apache.fury.collection.ObjectArray,\ + org.apache.fury.collection.ObjectIntMap,\ + org.apache.fury.collection.ObjectMap,\ + org.apache.fury.collection.Tuple2,\ + org.apache.fury.collection.Tuple3,\ + org.apache.fury.config.CompatibleMode,\ + org.apache.fury.config.Config,\ + org.apache.fury.config.FuryBuilder,\ + org.apache.fury.config.Language,\ + org.apache.fury.config.LongEncoding,\ + org.apache.fury.logging.FuryLogger,\ + org.apache.fury.logging.LoggerFactory,\ + org.apache.fury.memory.BoundsChecking,\ + org.apache.fury.memory.MemoryBuffer,\ + org.apache.fury.memory.MemoryUtils,\ + org.apache.fury.memory.Platform,\ + org.apache.fury.meta.ClassDef$ArrayFieldType,\ + org.apache.fury.meta.ClassDef$CollectionFieldType,\ + org.apache.fury.meta.ClassDef$EnumFieldType,\ + org.apache.fury.meta.ClassDef$FieldInfo,\ + org.apache.fury.meta.ClassDef$FieldType,\ + org.apache.fury.meta.ClassDef$MapFieldType,\ + org.apache.fury.meta.ClassDef$ObjectFieldType,\ + org.apache.fury.meta.ClassDef$RegisteredFieldType,\ + org.apache.fury.meta.ClassDef,\ + org.apache.fury.meta.ClassDefDecoder,\ + org.apache.fury.meta.ClassDefEncoder,\ + org.apache.fury.meta.ClassSpec,\ + org.apache.fury.meta.DeflaterMetaCompressor,\ + org.apache.fury.meta.Encoders,\ + org.apache.fury.meta.MetaCompressor,\ + org.apache.fury.meta.MetaString$Encoding,\ + org.apache.fury.meta.MetaString,\ + org.apache.fury.meta.MetaStringDecoder$1,\ + org.apache.fury.meta.MetaStringDecoder,\ + org.apache.fury.meta.MetaStringEncoder$1,\ + org.apache.fury.meta.MetaStringEncoder,\ + org.apache.fury.meta.TypeEqualMetaCompressor,\ + org.apache.fury.pool.ClassLoaderFuryPooled,\ + org.apache.fury.pool.FuryPooledObjectFactory,\ + org.apache.fury.pool.ThreadPoolFury,\ + org.apache.fury.reflect.FieldAccessor$GeneratedAccessor,\ + org.apache.fury.reflect.ReflectionUtils$1,\ + org.apache.fury.reflect.ReflectionUtils$2,\ + org.apache.fury.reflect.ReflectionUtils,\ + org.apache.fury.reflect.TypeRef$ClassOwnership$1,\ + org.apache.fury.reflect.TypeRef$ClassOwnership$2,\ + org.apache.fury.reflect.TypeRef$ClassOwnership,\ + org.apache.fury.reflect.TypeRef$TypeVariableKey,\ + org.apache.fury.reflect.TypeRef,\ + org.apache.fury.resolver.ClassChecker,\ + org.apache.fury.resolver.ClassInfo,\ + org.apache.fury.resolver.ClassInfoHolder,\ + org.apache.fury.resolver.ClassResolver$2,\ + org.apache.fury.resolver.ClassResolver$ExtRegistry,\ + org.apache.fury.resolver.ClassResolver$GraalvmClassRegistry,\ + org.apache.fury.resolver.ClassResolver,\ + org.apache.fury.resolver.DisallowedList,\ + org.apache.fury.resolver.FieldResolver$CollectionFieldInfo,\ + org.apache.fury.resolver.FieldResolver$FieldInfo,\ + org.apache.fury.resolver.FieldResolver$MapFieldInfo,\ + org.apache.fury.resolver.FieldResolver,\ + org.apache.fury.resolver.MetaContext,\ + org.apache.fury.resolver.MetaStringBytes,\ + org.apache.fury.resolver.MetaStringResolver,\ + org.apache.fury.resolver.NoRefResolver,\ + org.apache.fury.resolver.SerializationContext,\ + org.apache.fury.serializer.ArraySerializers$BooleanArraySerializer,\ + org.apache.fury.serializer.ArraySerializers$ByteArraySerializer,\ + org.apache.fury.serializer.ArraySerializers$CharArraySerializer,\ + org.apache.fury.serializer.ArraySerializers$DoubleArraySerializer,\ + org.apache.fury.serializer.ArraySerializers$FloatArraySerializer,\ + org.apache.fury.serializer.ArraySerializers$IntArraySerializer,\ + org.apache.fury.serializer.ArraySerializers$LongArraySerializer,\ + org.apache.fury.serializer.ArraySerializers$ObjectArraySerializer,\ + org.apache.fury.serializer.ArraySerializers$ShortArraySerializer,\ + org.apache.fury.serializer.ArraySerializers$StringArraySerializer,\ + org.apache.fury.serializer.ArraySerializers,\ + org.apache.fury.serializer.JavaSerializer$1,\ + org.apache.fury.serializer.JavaSerializer$2,\ + org.apache.fury.serializer.JavaSerializer$3,\ + org.apache.fury.serializer.JavaSerializer$4,\ + org.apache.fury.serializer.JavaSerializer,\ + org.apache.fury.serializer.JdkProxySerializer$ReplaceStub,\ org.apache.fury.serializer.JdkProxySerializer,\ + org.apache.fury.serializer.LambdaSerializer$ReplaceStub,\ + org.apache.fury.serializer.LambdaSerializer,\ + org.apache.fury.serializer.LocaleSerializer,\ + org.apache.fury.serializer.NonexistentClassSerializers$ClassFieldsInfo,\ + org.apache.fury.serializer.NonexistentClassSerializers$NonexistentClassSerializer,\ + org.apache.fury.serializer.NonexistentClassSerializers$NonexistentEnumClassSerializer,\ + org.apache.fury.serializer.OptionalSerializers$OptionalDoubleSerializer,\ + org.apache.fury.serializer.OptionalSerializers$OptionalIntSerializer,\ + org.apache.fury.serializer.OptionalSerializers$OptionalLongSerializer,\ + org.apache.fury.serializer.OptionalSerializers$OptionalSerializer,\ + org.apache.fury.serializer.PrimitiveSerializers$1,\ + org.apache.fury.serializer.PrimitiveSerializers$BooleanSerializer,\ + org.apache.fury.serializer.PrimitiveSerializers$ByteSerializer,\ + org.apache.fury.serializer.PrimitiveSerializers$CharSerializer,\ + org.apache.fury.serializer.PrimitiveSerializers$DoubleSerializer,\ + org.apache.fury.serializer.PrimitiveSerializers$FloatSerializer,\ + org.apache.fury.serializer.PrimitiveSerializers$IntSerializer,\ + org.apache.fury.serializer.PrimitiveSerializers$LongSerializer,\ + org.apache.fury.serializer.PrimitiveSerializers$ShortSerializer,\ + org.apache.fury.serializer.ReplaceResolveSerializer$1,\ + org.apache.fury.serializer.ReplaceResolveSerializer$ReplaceStub,\ + org.apache.fury.serializer.ReplaceResolveSerializer,\ + org.apache.fury.serializer.Serializers$AtomicBooleanSerializer,\ + org.apache.fury.serializer.Serializers$AtomicIntegerSerializer,\ + org.apache.fury.serializer.Serializers$AtomicLongSerializer,\ + org.apache.fury.serializer.Serializers$AtomicReferenceSerializer,\ + org.apache.fury.serializer.Serializers$BigDecimalSerializer,\ + org.apache.fury.serializer.Serializers$BigIntegerSerializer,\ + org.apache.fury.serializer.Serializers$ClassSerializer,\ + org.apache.fury.serializer.Serializers$CurrencySerializer,\ + org.apache.fury.serializer.Serializers$EmptyObjectSerializer,\ + org.apache.fury.serializer.Serializers$RegexSerializer,\ + org.apache.fury.serializer.Serializers$StringBufferSerializer,\ + org.apache.fury.serializer.Serializers$StringBuilderSerializer,\ + org.apache.fury.serializer.Serializers$URISerializer,\ + org.apache.fury.serializer.Serializers$UUIDSerializer,\ + org.apache.fury.serializer.Serializers,\ org.apache.fury.serializer.StringSerializer$Offset,\ org.apache.fury.serializer.StringSerializer,\ - org.apache.fury.serializer.Serializers,\ + org.apache.fury.serializer.TimeSerializers$DateSerializer,\ + org.apache.fury.serializer.TimeSerializers$DurationSerializer,\ + org.apache.fury.serializer.TimeSerializers$InstantSerializer,\ + org.apache.fury.serializer.TimeSerializers$LocalDateSerializer,\ + org.apache.fury.serializer.TimeSerializers$LocalDateTimeSerializer,\ + org.apache.fury.serializer.TimeSerializers$LocalTimeSerializer,\ + org.apache.fury.serializer.TimeSerializers$MonthDaySerializer,\ + org.apache.fury.serializer.TimeSerializers$OffsetDateTimeSerializer,\ + org.apache.fury.serializer.TimeSerializers$OffsetTimeSerializer,\ + org.apache.fury.serializer.TimeSerializers$PeriodSerializer,\ + org.apache.fury.serializer.TimeSerializers$SqlDateSerializer,\ + org.apache.fury.serializer.TimeSerializers$SqlTimeSerializer,\ + org.apache.fury.serializer.TimeSerializers$TimestampSerializer,\ + org.apache.fury.serializer.TimeSerializers$YearMonthSerializer,\ + org.apache.fury.serializer.TimeSerializers$YearSerializer,\ + org.apache.fury.serializer.TimeSerializers$ZoneOffsetSerializer,\ + org.apache.fury.serializer.TimeSerializers$ZonedDateTimeSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$ArrayDequeSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$ArrayListSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$ArraysAsListSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$BitSetSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$CollectionsSingletonListSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$CollectionsSingletonSetSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$ConcurrentHashMapKeySetViewSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$ConcurrentSkipListSetSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$CopyOnWriteArrayListSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$EmptyListSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$EmptySetSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$EmptySortedSetSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$HashSetSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$LinkedHashSetSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$PriorityQueueSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$SetFromMapSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$SortedSetSerializer,\ + org.apache.fury.serializer.collection.CollectionSerializers$VectorSerializer,\ + org.apache.fury.serializer.collection.FuryArrayAsListSerializer$ArrayAsList,\ + org.apache.fury.serializer.collection.FuryArrayAsListSerializer,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$1,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$1GuavaEmptyBiMap,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$1GuavaEmptySet,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$1GuavaEmptySortedMap,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$1GuavaEmptySortedSet,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$GuavaCollectionSerializer,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$GuavaMapSerializer,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$ImmutableBiMapSerializer,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$ImmutableListSerializer,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$ImmutableMapSerializer,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$ImmutableSetSerializer,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$ImmutableSortedMapSerializer,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$ImmutableSortedSetSerializer,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers$RegularImmutableListSerializer,\ + org.apache.fury.serializer.collection.GuavaCollectionSerializers,\ + org.apache.fury.serializer.collection.ImmutableCollectionSerializers$ImmutableListSerializer,\ + org.apache.fury.serializer.collection.ImmutableCollectionSerializers$ImmutableMapSerializer,\ + org.apache.fury.serializer.collection.ImmutableCollectionSerializers$ImmutableSetSerializer,\ + org.apache.fury.serializer.collection.ImmutableCollectionSerializers,\ + org.apache.fury.serializer.collection.MapSerializers$ConcurrentHashMapSerializer,\ + org.apache.fury.serializer.collection.MapSerializers$ConcurrentSkipListMapSerializer,\ + org.apache.fury.serializer.collection.MapSerializers$EmptyMapSerializer,\ + org.apache.fury.serializer.collection.MapSerializers$EmptySortedMapSerializer,\ + org.apache.fury.serializer.collection.MapSerializers$EnumMapSerializer,\ + org.apache.fury.serializer.collection.MapSerializers$HashMapSerializer,\ + org.apache.fury.serializer.collection.MapSerializers$LazyMapSerializer,\ + org.apache.fury.serializer.collection.MapSerializers$LinkedHashMapSerializer,\ + org.apache.fury.serializer.collection.MapSerializers$SingletonMapSerializer,\ + org.apache.fury.serializer.collection.MapSerializers$SortedMapSerializer,\ + org.apache.fury.serializer.collection.SynchronizedSerializers$Offset,\ + org.apache.fury.serializer.collection.SynchronizedSerializers$SynchronizedCollectionSerializer,\ + org.apache.fury.serializer.collection.SynchronizedSerializers$SynchronizedMapSerializer,\ + org.apache.fury.serializer.collection.SynchronizedSerializers,\ + org.apache.fury.serializer.collection.UnmodifiableSerializers$Offset,\ + org.apache.fury.serializer.collection.UnmodifiableSerializers$UnmodifiableCollectionSerializer,\ + org.apache.fury.serializer.collection.UnmodifiableSerializers$UnmodifiableMapSerializer,\ + org.apache.fury.serializer.collection.UnmodifiableSerializers,\ org.apache.fury.serializer.shim.ShimDispatcher,\ - org.apache.fury.memory.Platform,\ - org.apache.fury.util.unsafe._Lookup,\ - org.apache.fury.util.unsafe._JDKAccess,\ + org.apache.fury.shaded.org.codehaus.janino.IClass$1,\ + org.apache.fury.type.Descriptor$1,\ + org.apache.fury.type.Descriptor,\ + org.apache.fury.type.DescriptorGrouper,\ + org.apache.fury.type.GenericType,\ + org.apache.fury.type.Generics,\ org.apache.fury.type.Type,\ org.apache.fury.type.TypeUtils,\ - org.apache.fury.Fury,\ - org.apache.fury.type.Type,\ - org.apache.fury.serializer.JavaSerializer,\ - org.apache.fury.reflect.ReflectionUtils,\ - org.apache.fury.builder.ObjectCodecBuilder,\ - org.apache.fury.shaded.org.codehaus.janino.Java$ArrayType,\ - org.apache.fury.serializer.LocaleSerializer,\ - org.apache.fury.shaded.org.codehaus.janino.Java$AbstractCompilationUnit$TypeImportOnDemandDeclaration,\ - org.apache.fury.shaded.org.codehaus.janino.Compiler,\ - org.apache.fury.shaded.org.codehaus.janino.UnitCompiler,\ - com.google.common.util.concurrent.SettableFuture,\ - org.apache.fury.config.FuryBuilder,\ - org.apache.fury.shaded.org.codehaus.janino.Java$MethodInvocation,\ - org.apache.fury.shaded.org.codehaus.janino.Java$FunctionDeclarator$FormalParameter,\ - org.apache.fury.shaded.org.codehaus.janino.Java$ExpressionStatement,\ - org.apache.fury.shaded.org.codehaus.janino.Java$FunctionDeclarator$FormalParameters,\ - org.apache.fury.shaded.org.codehaus.janino.Java$Rvalue,\ - org.apache.fury.shaded.javassist.util.proxy.DefineClassHelper,\ - org.apache.fury.shaded.org.codehaus.janino.Java$LocalVariableAccess,\ - org.apache.fury.shaded.org.codehaus.janino.ClassLoaderIClassLoader,\ - org.apache.fury.shaded.org.codehaus.janino.Java$Located$1,\ - org.apache.fury.shaded.org.codehaus.janino.Java$EmptyStatement,\ - org.apache.fury.shaded.org.codehaus.janino.Java$ForStatement,\ - org.apache.fury.shaded.org.codehaus.janino.Java$Type,\ - org.apache.fury.shaded.org.codehaus.janino.Java$Cast,\ - org.apache.fury.shaded.org.codehaus.janino.Java$BooleanRvalue,\ - org.apache.fury.shaded.org.codehaus.janino.IClass$PrimitiveIClass,\ - org.apache.fury.shaded.org.codehaus.janino.Compiler$CompilerIClassLoader,\ - org.apache.fury.shaded.javassist.util.proxy.SecurityActions,\ + org.apache.fury.util.ClassLoaderUtils$ByteArrayClassLoader,\ + org.apache.fury.util.ClassLoaderUtils$ParentClassLoader,\ + org.apache.fury.util.ClassLoaderUtils,\ + org.apache.fury.util.DelayedRef,\ + org.apache.fury.util.function.Functions,\ + org.apache.fury.util.GraalvmSupport,\ + org.apache.fury.util.LoaderBinding$1,\ + org.apache.fury.util.LoaderBinding$StagingType,\ + org.apache.fury.util.LoaderBinding,\ + org.apache.fury.util.StringUtils,\ + org.apache.fury.util.record.RecordComponent,\ + org.apache.fury.util.record.RecordUtils$1,\ + org.apache.fury.util.record.RecordUtils$2,\ + org.apache.fury.util.record.RecordUtils$3,\ + org.apache.fury.util.record.RecordUtils,\ + org.apache.fury.util.unsafe._JDKAccess$1,\ + org.apache.fury.util.unsafe._JDKAccess,\ org.apache.fury.util.unsafe._Lookup,\ + org.apache.fury.codegen.JaninoUtils$CodeStats,\ + org.apache.fury.shaded.org.codehaus.commons.compiler.Location,\ + org.apache.fury.shaded.org.codehaus.commons.compiler.util.iterator.Iterables,\ + org.apache.fury.shaded.org.codehaus.commons.compiler.util.iterator.Iterables$1,\ + org.apache.fury.shaded.org.codehaus.commons.compiler.util.iterator.Iterables$2,\ + org.apache.fury.shaded.org.codehaus.commons.compiler.util.iterator.Iterables$3,\ + org.apache.fury.shaded.org.codehaus.commons.compiler.util.iterator.Iterables$4,\ org.apache.fury.shaded.org.codehaus.commons.compiler.util.iterator.Iterables$5,\ - com.google.common.base.internal.Finalizer,\ - org.apache.fury.serializer.ReplaceResolveSerializer,\ - com.google.common.primitives.Primitives,\ - org.apache.fury.type.GenericType,\ - org.apache.fury.shaded.org.codehaus.janino.Java$BreakableStatement,\ - org.apache.fury.shaded.org.codehaus.janino.Java$LocalVariableDeclarationStatement,\ - org.apache.fury.shaded.org.codehaus.janino.TokenStreamImpl$1,\ - org.apache.fury.shaded.org.codehaus.janino.Java$ThisReference,\ + org.apache.fury.shaded.org.codehaus.janino.IType,\ + org.apache.fury.shaded.org.codehaus.janino.Access,\ + org.apache.fury.shaded.org.codehaus.janino.ClassFileIClass,\ + org.apache.fury.shaded.org.codehaus.janino.ClassLoaderIClassLoader,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$1,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$BasicBlock,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$Branch,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$ExceptionTableEntry,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$FixUp,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$FourByteOffset,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$Inserter,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$LineNumberOffset,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$LocalScope,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$Offset,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$OffsetBranch,\ + org.apache.fury.shaded.org.codehaus.janino.CodeContext$Relocatable,\ + org.apache.fury.shaded.org.codehaus.janino.Compiler,\ + org.apache.fury.shaded.org.codehaus.janino.Compiler$2,\ + org.apache.fury.shaded.org.codehaus.janino.Compiler$CompilerIClassLoader,\ + org.apache.fury.shaded.org.codehaus.janino.Descriptor,\ org.apache.fury.shaded.org.codehaus.janino.IClass,\ - org.apache.fury.shaded.org.codehaus.janino.Java$ClassLiteral,\ - org.apache.fury.resolver.ClassResolver$2,\ - org.apache.fury.meta.ClassDef,\ - org.apache.fury.meta.Encoders,\ - org.apache.fury.shaded.org.codehaus.janino.Parser$1,\ + org.apache.fury.shaded.org.codehaus.janino.IClass$1,\ + org.apache.fury.shaded.org.codehaus.janino.IClass$2,\ + org.apache.fury.shaded.org.codehaus.janino.IClass$IAnnotation,\ + org.apache.fury.shaded.org.codehaus.janino.IClass$IConstructor,\ + org.apache.fury.shaded.org.codehaus.janino.IClass$IField,\ + org.apache.fury.shaded.org.codehaus.janino.IClass$IInvocable,\ + org.apache.fury.shaded.org.codehaus.janino.IClass$IMember,\ + org.apache.fury.shaded.org.codehaus.janino.IClass$IMethod,\ + org.apache.fury.shaded.org.codehaus.janino.IClass$PrimitiveIClass,\ + org.apache.fury.shaded.org.codehaus.janino.IClassLoader,\ + org.apache.fury.shaded.org.codehaus.janino.IClassLoader$1,\ + org.apache.fury.shaded.org.codehaus.janino.IParameterizedType,\ + org.apache.fury.shaded.org.codehaus.janino.IType,\ + org.apache.fury.shaded.org.codehaus.janino.ITypeVariable,\ + org.apache.fury.shaded.org.codehaus.janino.ITypeVariableOrIClass,\ + org.apache.fury.shaded.org.codehaus.janino.JaninoOption,\ + org.apache.fury.shaded.org.codehaus.janino.Java,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AbstractAnnotation,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AbstractClassDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AbstractCompilationUnit,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AbstractCompilationUnit$ImportDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AbstractCompilationUnit$SingleStaticImportDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AbstractCompilationUnit$SingleTypeImportDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AbstractCompilationUnit$StaticImportOnDemandDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AbstractCompilationUnit$TypeImportOnDemandDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AbstractTypeBodyDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AbstractTypeDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AccessModifier,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AlternateConstructorInvocation,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AmbiguousName,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Annotatable,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Annotation,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AnnotationTypeDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AnonymousClassDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ArrayAccessExpression,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ArrayCreationReference,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ArrayInitializerOrRvalue,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ArrayLength,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ArrayType,\ + org.apache.fury.shaded.org.codehaus.janino.Java$AssertStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Assignment,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Atom,\ org.apache.fury.shaded.org.codehaus.janino.Java$BinaryOperation,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Block,\ + org.apache.fury.shaded.org.codehaus.janino.Java$BlockStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$BooleanLiteral,\ + org.apache.fury.shaded.org.codehaus.janino.Java$BooleanRvalue,\ + org.apache.fury.shaded.org.codehaus.janino.Java$BreakStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$BreakableStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Cast,\ + org.apache.fury.shaded.org.codehaus.janino.Java$CatchClause,\ + org.apache.fury.shaded.org.codehaus.janino.Java$CatchParameter,\ + org.apache.fury.shaded.org.codehaus.janino.Java$CharacterLiteral,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ClassDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ClassInstanceCreationReference,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ClassLiteral,\ + org.apache.fury.shaded.org.codehaus.janino.Java$CompilationUnit,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ConditionalExpression,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ConstructorDeclarator,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ConstructorInvocation,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ContinuableStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ContinueStatement,\ org.apache.fury.shaded.org.codehaus.janino.Java$Crement,\ - org.apache.fury.shaded.org.codehaus.janino.Java$ReturnStatement,\ - org.apache.fury.shaded.org.codehaus.janino.Java$WhileStatement,\ - org.apache.fury.shaded.org.codehaus.janino.Java$FunctionDeclarator,\ - org.apache.fury.shaded.org.codehaus.janino.Java$Atom,\ - org.apache.fury.shaded.org.codehaus.janino.Java$SimpleType,\ + org.apache.fury.shaded.org.codehaus.janino.Java$DoStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$DocCommentable,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ElementValue,\ + org.apache.fury.shaded.org.codehaus.janino.Java$EmptyStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$EnclosingScopeOfTypeDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$EnumConstant,\ + org.apache.fury.shaded.org.codehaus.janino.Java$EnumDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ExpressionStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$FieldAccess,\ org.apache.fury.shaded.org.codehaus.janino.Java$FieldAccessExpression,\ - org.apache.fury.shaded.org.codehaus.janino.Java$AbstractTypeBodyDeclaration,\ - org.apache.fury.shaded.org.codehaus.janino.Parser,\ - org.apache.fury.shaded.org.codehaus.janino.Java$QualifiedThisReference,\ - org.apache.fury.shaded.org.codehaus.janino.Java$Assignment,\ - org.apache.fury.shaded.org.codehaus.janino.Java$NullLiteral,\ - org.apache.fury.shaded.org.codehaus.janino.Java$ParenthesizedExpression,\ - org.apache.fury.shaded.org.codehaus.janino.Java$Statement,\ - org.apache.fury.shaded.org.codehaus.janino.IClassLoader$1,\ - org.apache.fury.shaded.org.codehaus.janino.Java$VariableDeclarator,\ - org.apache.fury.shaded.org.codehaus.janino.Java$AbstractCompilationUnit$SingleTypeImportDeclaration,\ - org.apache.fury.shaded.org.codehaus.janino.Java$MethodDeclarator,\ - com.google.common.base.FinalizableReferenceQueue,\ - org.apache.fury.shaded.org.codehaus.janino.Java$AbstractCompilationUnit$ImportDeclaration,\ - org.apache.fury.codegen.JaninoUtils,\ + org.apache.fury.shaded.org.codehaus.janino.Java$FieldDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$FieldDeclarationOrInitializer,\ + org.apache.fury.shaded.org.codehaus.janino.Java$FloatingPointLiteral,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ForEachStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ForStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$FunctionDeclarator,\ + org.apache.fury.shaded.org.codehaus.janino.Java$FunctionDeclarator$FormalParameter,\ + org.apache.fury.shaded.org.codehaus.janino.Java$FunctionDeclarator$FormalParameters,\ + org.apache.fury.shaded.org.codehaus.janino.Java$IfStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Initializer,\ + org.apache.fury.shaded.org.codehaus.janino.Java$InnerClassDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Instanceof,\ + org.apache.fury.shaded.org.codehaus.janino.Java$IntegerLiteral,\ + org.apache.fury.shaded.org.codehaus.janino.Java$InterfaceDeclaration,\ org.apache.fury.shaded.org.codehaus.janino.Java$Invocation,\ - org.apache.fury.shaded.org.codehaus.janino.ReflectionIClass,\ - org.apache.fury.util.record.RecordUtils,\ - org.apache.fury.logging.FuryLogger,\ - org.apache.fury.logging.LoggerFactory,\ + org.apache.fury.shaded.org.codehaus.janino.Java$LabeledStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$LambdaBody,\ + org.apache.fury.shaded.org.codehaus.janino.Java$LambdaExpression,\ + org.apache.fury.shaded.org.codehaus.janino.Java$LambdaParameters,\ org.apache.fury.shaded.org.codehaus.janino.Java$Literal,\ - org.apache.fury.shaded.org.codehaus.janino.IClassLoader,\ - org.apache.fury.shaded.org.codehaus.janino.Java$PrimitiveType,\ - org.apache.fury.shaded.org.codehaus.janino.CodeContext,\ - org.apache.fury.serializer.collection.ImmutableCollectionSerializers,\ - org.apache.fury.shaded.org.codehaus.janino.IClass$2,\ - com.google.common.collect.RegularImmutableMap,\ - org.apache.fury.shaded.org.codehaus.janino.Descriptor,\ + org.apache.fury.shaded.org.codehaus.janino.Java$LocalClassDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$LocalClassDeclarationStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$LocalVariable,\ + org.apache.fury.shaded.org.codehaus.janino.Java$LocalVariableAccess,\ + org.apache.fury.shaded.org.codehaus.janino.Java$LocalVariableDeclarationStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$LocalVariableSlot,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Locatable,\ org.apache.fury.shaded.org.codehaus.janino.Java$Located,\ - org.apache.fury.shaded.org.codehaus.janino.Java$ReferenceType,\ - org.apache.fury.shaded.org.codehaus.janino.Java$UnaryOperation,\ - org.apache.fury.util.ClassLoaderUtils,\ - org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$39,\ - org.apache.fury.shaded.org.codehaus.janino.Java$IntegerLiteral,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Located$1,\ org.apache.fury.shaded.org.codehaus.janino.Java$Lvalue,\ + org.apache.fury.shaded.org.codehaus.janino.Java$MarkerAnnotation,\ + org.apache.fury.shaded.org.codehaus.janino.Java$MemberAnnotationTypeDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$MemberClassDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$MemberEnumDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$MemberInterfaceDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$MemberTypeDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$MethodDeclarator,\ + org.apache.fury.shaded.org.codehaus.janino.Java$MethodInvocation,\ + org.apache.fury.shaded.org.codehaus.janino.Java$MethodReference,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Modifier,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ModularCompilationUnit,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ModuleDirective,\ + org.apache.fury.shaded.org.codehaus.janino.Java$NamedClassDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$NamedTypeDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$NewAnonymousClassInstance,\ + org.apache.fury.shaded.org.codehaus.janino.Java$NewArray,\ + org.apache.fury.shaded.org.codehaus.janino.Java$NewClassInstance,\ + org.apache.fury.shaded.org.codehaus.janino.Java$NewInitializedArray,\ + org.apache.fury.shaded.org.codehaus.janino.Java$NullLiteral,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Package,\ org.apache.fury.shaded.org.codehaus.janino.Java$PackageDeclaration,\ - org.apache.fury.shaded.org.codehaus.janino.Java$FieldAccess,\ - org.apache.fury.shaded.org.codehaus.janino.Java$Block,\ - org.apache.fury.builder.AccessorHelper,\ - org.apache.fury.codegen.Expression$Literal,\ - org.apache.fury.shaded.org.codehaus.janino.Java$ContinuableStatement,\ - org.apache.fury.shaded.org.codehaus.janino.Java$IfStatement,\ - com.google.common.collect.RegularImmutableBiMap,\ - org.apache.fury.shaded.org.codehaus.janino.Java$ConstructorDeclarator,\ + org.apache.fury.shaded.org.codehaus.janino.Java$PackageMemberAnnotationTypeDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$PackageMemberClassDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$PackageMemberEnumDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$PackageMemberInterfaceDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$PackageMemberTypeDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ParameterAccess,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ParenthesizedExpression,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Primitive,\ + org.apache.fury.shaded.org.codehaus.janino.Java$PrimitiveType,\ + org.apache.fury.shaded.org.codehaus.janino.Java$QualifiedThisReference,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ReferenceType,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ReturnStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Rvalue,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Rvalue$1,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Rvalue$2,\ + org.apache.fury.shaded.org.codehaus.janino.Java$RvalueMemberType,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Scope,\ + org.apache.fury.shaded.org.codehaus.janino.Java$SimpleConstant,\ + org.apache.fury.shaded.org.codehaus.janino.Java$SimpleType,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Statement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$StringLiteral,\ org.apache.fury.shaded.org.codehaus.janino.Java$SuperConstructorInvocation,\ - org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$44,\ - org.apache.fury.shaded.org.codehaus.janino.Java$AmbiguousName,\ + org.apache.fury.shaded.org.codehaus.janino.Java$SuperclassFieldAccessExpression,\ + org.apache.fury.shaded.org.codehaus.janino.Java$SuperclassMethodInvocation,\ + org.apache.fury.shaded.org.codehaus.janino.Java$SwitchStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$SwitchStatement$SwitchBlockStatementGroup,\ + org.apache.fury.shaded.org.codehaus.janino.Java$SynchronizedStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ThisReference,\ + org.apache.fury.shaded.org.codehaus.janino.Java$ThrowStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$TryStatement,\ + org.apache.fury.shaded.org.codehaus.janino.Java$TryStatement$LocalVariableDeclaratorResource,\ + org.apache.fury.shaded.org.codehaus.janino.Java$TryStatement$Resource,\ + org.apache.fury.shaded.org.codehaus.janino.Java$TryStatement$VariableAccessResource,\ + org.apache.fury.shaded.org.codehaus.janino.Java$Type,\ + org.apache.fury.shaded.org.codehaus.janino.Java$TypeArgument,\ + org.apache.fury.shaded.org.codehaus.janino.Java$TypeBodyDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$TypeDeclaration,\ + org.apache.fury.shaded.org.codehaus.janino.Java$UnaryOperation,\ + org.apache.fury.shaded.org.codehaus.janino.Java$VariableDeclarator,\ + org.apache.fury.shaded.org.codehaus.janino.Java$WhileStatement,\ + org.apache.fury.shaded.org.codehaus.janino.MethodDescriptor,\ + org.apache.fury.shaded.org.codehaus.janino.Mod,\ + org.apache.fury.shaded.org.codehaus.janino.Parser,\ + org.apache.fury.shaded.org.codehaus.janino.Parser$1,\ + org.apache.fury.shaded.org.codehaus.janino.Parser$ClassDeclarationContext,\ + org.apache.fury.shaded.org.codehaus.janino.Parser$MethodDeclarationContext,\ + org.apache.fury.shaded.org.codehaus.janino.ReflectionIClass,\ + org.apache.fury.shaded.org.codehaus.janino.ReflectionIClass$3,\ + org.apache.fury.shaded.org.codehaus.janino.ReflectionIClass$ReflectionIConstructor,\ + org.apache.fury.shaded.org.codehaus.janino.ReflectionIClass$ReflectionIField,\ + org.apache.fury.shaded.org.codehaus.janino.ReflectionIClass$ReflectionIMethod,\ + org.apache.fury.shaded.org.codehaus.janino.ResourceFinderIClassLoader,\ org.apache.fury.shaded.org.codehaus.janino.Scanner,\ - org.apache.fury.shaded.org.codehaus.janino.Java$FieldDeclaration,\ - org.apache.fury.memory.BoundsChecking,\ - org.apache.fury.shaded.org.codehaus.janino.Java$Package,\ - org.apache.fury.serializer.ArraySerializers,\ - org.apache.fury.serializer.ArraySerializers$ObjectArraySerializer,\ - org.apache.fury.shaded.org.codehaus.janino.Java$AccessModifier,\ - org.apache.fury.util.ClassLoaderUtils$ParentClassLoader,\ - com.google.common.collect.RegularImmutableSortedSet,\ - org.apache.fury.type.Descriptor,\ - org.apache.fury.serializer.PrimitiveSerializers$1,\ - org.apache.fury.collection.MultiKeyWeakMap,\ - org.apache.fury.serializer.collection.UnmodifiableSerializers,\ - org.apache.fury.codegen.CompileUnit,\ - org.apache.fury.serializer.StringSerializer,\ - com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper,\ - org.apache.fury.memory.MemoryBuffer,\ - com.google.common.math.IntMath$1,\ - org.apache.fury.resolver.ClassResolver,\ - org.apache.fury.codegen.CodegenContext,\ - org.apache.fury.serializer.collection.GuavaCollectionSerializers,\ - org.apache.fury.util.unsafe._JDKAccess,\ - org.apache.fury.codegen.CodeGenerator,\ - org.apache.fury.serializer.collection.SynchronizedSerializers,\ - org.apache.fury.util.ClassLoaderUtils$ByteArrayClassLoader,\ - com.google.common.collect.AbstractIterator$1,\ - com.google.common.cache.LocalCache,\ - org.apache.fury.serializer.LambdaSerializer,\ - com.google.common.collect.ImmutableSortedMap,\ - org.apache.fury.memory.MemoryUtils,\ - org.apache.fury.type.DescriptorGrouper,\ - sun.misc.Unsafe,\ - com.google.common.collect.Platform,\ - org.apache.fury.meta.MetaString,\ - org.apache.fury.meta.MetaStringDecoder$1,\ - org.apache.fury.meta.MetaStringEncoder$1,\ - org.apache.fury.meta.MetaString$Encoding,\ - org.apache.fury.meta.Encoders,\ - org.apache.fury.reflect.TypeRef$ClassOwnership,\ - org.apache.fury.reflect.TypeRef$ClassOwnership$1,\ - org.apache.fury.reflect.TypeRef$ClassOwnership$2,\ - org.apache.fury.resolver.DisallowedList,\ - org.apache.fury.util.StringUtils + org.apache.fury.shaded.org.codehaus.janino.StackMap,\ + org.apache.fury.shaded.org.codehaus.janino.Token,\ + org.apache.fury.shaded.org.codehaus.janino.TokenStream,\ + org.apache.fury.shaded.org.codehaus.janino.TokenStreamImpl,\ + org.apache.fury.shaded.org.codehaus.janino.TokenStreamImpl$1,\ + org.apache.fury.shaded.org.codehaus.janino.TokenType,\ + org.apache.fury.shaded.org.codehaus.janino.UnicodeUnescapeException,\ + org.apache.fury.shaded.org.codehaus.janino.UnicodeUnescapeReader,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$11,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$12,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$13,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$14,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$14$1,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$15,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$15$1,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$16,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$16$1,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$17,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$17$1,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$17$2,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$19,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$19$1,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$2,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$20,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$22,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$23,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$24,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$25,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$26,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$28,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$28$1,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$28$2,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$28$2$1,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$29,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$3,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$30,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$32,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$33,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$34,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$35,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$36,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$37,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$38,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$39,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$40,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$41,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$42,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$43,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$44,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$6,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$7,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$8,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$ClassFileConsumer,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$Compilable2,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$SimpleIField,\ + org.apache.fury.shaded.org.codehaus.janino.UnitCompiler$SwitchKind,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$AbstractCompilationUnitVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$AnnotationVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$ArrayInitializerOrRvalueVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$AtomVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$BlockStatementVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$ConstructorInvocationVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$ElementValueVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$FieldDeclarationOrInitializerVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$FunctionDeclaratorVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$ImportVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$LvalueVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$RvalueVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$TryStatementResourceVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$TypeBodyDeclarationVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$TypeDeclarationVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.Visitor$TypeVisitor,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$1,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$10,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$11,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$2,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$3,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$4,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$4$1,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$5,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$6,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$7,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$7$1,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$8,\ + org.apache.fury.shaded.org.codehaus.janino.util.AbstractTraverser$9,\ + org.apache.fury.shaded.org.codehaus.janino.util.Annotatable,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$1,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$AnnotationDefaultAttribute,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$AttributeInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ClassFileException,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$CodeAttribute,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$CodeAttribute$ExceptionTableEntry,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantClassInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantDoubleInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantFieldrefInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantFloatInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantIntegerInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantInterfaceMethodrefInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantInvokeDynamicInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantLongInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantMethodHandleInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantMethodTypeInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantMethodrefInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantNameAndTypeInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantPoolInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantStringInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantUtf8Info,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ConstantValuePoolInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$DeprecatedAttribute,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ElementValue,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$ExceptionsAttribute,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$FieldInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$LineNumberTableAttribute,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$LineNumberTableAttribute$Entry,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$MethodInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$SourceFileAttribute,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$1,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$2,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$3,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$4,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$5,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$6,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$7,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$AppendFrame,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$ChopFrame,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$FullFrame,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$ObjectVariableInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$SameFrame,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$SameFrameExtended,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$SameLocals1StackItemFrame,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$SameLocals1StackItemFrameExtended,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$StackMapFrame,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$UninitializedVariableInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.ClassFile$StackMapTableAttribute$VerificationTypeInfo,\ + org.apache.fury.shaded.org.codehaus.janino.util.Traverser,\ + sun.misc.Unsafe diff --git a/java/fury-core/src/test/java/org/apache/fury/serializer/CodegenSerializerTest.java b/java/fury-core/src/test/java/org/apache/fury/serializer/CodegenSerializerTest.java index 862cb434b2..7da0848653 100644 --- a/java/fury-core/src/test/java/org/apache/fury/serializer/CodegenSerializerTest.java +++ b/java/fury-core/src/test/java/org/apache/fury/serializer/CodegenSerializerTest.java @@ -66,7 +66,7 @@ public void testSimpleBean() { } @Test(dataProvider = "furyCopyConfig") - public void testSimpleBean(Fury fury) { + public void testSimpleBeanCopy(Fury fury) { B b = new B(); b.f1 = "str1"; b.f2 = 1;