diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/RowCoderGenerator.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/RowCoderGenerator.java index 5a37a22e22dcd..5ce7358d8824e 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/RowCoderGenerator.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/RowCoderGenerator.java @@ -17,7 +17,6 @@ */ package org.apache.beam.sdk.coders; -import static org.apache.beam.sdk.util.ByteBuddyUtils.getClassLoadingStrategy; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; import java.io.IOException; @@ -37,6 +36,7 @@ import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.description.type.TypeDescription.ForLoadedType; import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.dynamic.scaffold.InstrumentedType; import net.bytebuddy.implementation.FixedValue; import net.bytebuddy.implementation.Implementation; @@ -55,7 +55,6 @@ import org.apache.beam.sdk.schemas.Schema.Field; import org.apache.beam.sdk.schemas.Schema.FieldType; import org.apache.beam.sdk.schemas.SchemaCoder; -import org.apache.beam.sdk.util.common.ReflectHelpers; import org.apache.beam.sdk.values.Row; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Maps; @@ -173,9 +172,7 @@ public static Coder generate(Schema schema) { rowCoder = builder .make() - .load( - ReflectHelpers.findClassLoader(schema.getClass().getClassLoader()), - getClassLoadingStrategy(schema.getClass())) + .load(Coder.class.getClassLoader(), ClassLoadingStrategy.Default.INJECTION) .getLoaded() .getDeclaredConstructor(Coder[].class, int[].class) .newInstance((Object) componentCoders, (Object) encodingPosToRowIndex); diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/AvroByteBuddyUtils.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/AvroByteBuddyUtils.java index 4c9055ba245c0..eb01b83c94fc1 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/AvroByteBuddyUtils.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/AvroByteBuddyUtils.java @@ -17,8 +17,6 @@ */ package org.apache.beam.sdk.schemas.utils; -import static org.apache.beam.sdk.util.ByteBuddyUtils.getClassLoadingStrategy; - import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Type; @@ -27,6 +25,7 @@ import net.bytebuddy.asm.AsmVisitorWrapper; import net.bytebuddy.description.type.TypeDescription.ForLoadedType; import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.implementation.MethodCall; import net.bytebuddy.implementation.bytecode.StackManipulation; import net.bytebuddy.implementation.bytecode.assign.TypeCasting; @@ -100,7 +99,7 @@ private static SchemaUserTypeCreator createCreator(Class clazz, Schema sc .make() .load( ReflectHelpers.findClassLoader(clazz.getClassLoader()), - getClassLoadingStrategy(clazz)) + ClassLoadingStrategy.Default.INJECTION) .getLoaded() .getDeclaredConstructor() .newInstance(); diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/ByteBuddyUtils.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/ByteBuddyUtils.java index 65eaffb9318f7..bb0003c4d4dc0 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/ByteBuddyUtils.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/ByteBuddyUtils.java @@ -17,7 +17,6 @@ */ package org.apache.beam.sdk.schemas.utils; -import static org.apache.beam.sdk.util.ByteBuddyUtils.getClassLoadingStrategy; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; import java.lang.reflect.Constructor; @@ -44,6 +43,7 @@ import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.description.type.TypeDescription.ForLoadedType; import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.dynamic.scaffold.InstrumentedType; import net.bytebuddy.implementation.Implementation; import net.bytebuddy.implementation.Implementation.Context; @@ -459,7 +459,7 @@ public InstrumentedType prepare(InstrumentedType instrumentedType) { .make() .load( ReflectHelpers.findClassLoader(((Class) fromType).getClassLoader()), - getClassLoadingStrategy((Class) fromType)) + ClassLoadingStrategy.Default.INJECTION) .getLoaded(); } diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/JavaBeanUtils.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/JavaBeanUtils.java index 49d30f0e34549..ec0dba2c9421c 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/JavaBeanUtils.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/JavaBeanUtils.java @@ -17,8 +17,6 @@ */ package org.apache.beam.sdk.schemas.utils; -import static org.apache.beam.sdk.util.ByteBuddyUtils.getClassLoadingStrategy; - import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -30,6 +28,7 @@ import net.bytebuddy.asm.AsmVisitorWrapper; import net.bytebuddy.description.method.MethodDescription.ForLoadedMethod; import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.dynamic.scaffold.InstrumentedType; import net.bytebuddy.implementation.FixedValue; import net.bytebuddy.implementation.Implementation; @@ -163,7 +162,7 @@ public static FieldValueGetter createGetter( .load( ReflectHelpers.findClassLoader( typeInformation.getMethod().getDeclaringClass().getClassLoader()), - getClassLoadingStrategy(typeInformation.getMethod().getDeclaringClass())) + ClassLoadingStrategy.Default.INJECTION) .getLoaded() .getDeclaredConstructor() .newInstance(); @@ -227,7 +226,7 @@ public static FieldValueSetter createSetter( .load( ReflectHelpers.findClassLoader( typeInformation.getMethod().getDeclaringClass().getClassLoader()), - getClassLoadingStrategy(typeInformation.getMethod().getDeclaringClass())) + ClassLoadingStrategy.Default.INJECTION) .getLoaded() .getDeclaredConstructor() .newInstance(); @@ -291,7 +290,7 @@ public static SchemaUserTypeCreator createConstructorCreator( .make() .load( ReflectHelpers.findClassLoader(clazz.getClassLoader()), - getClassLoadingStrategy(clazz)) + ClassLoadingStrategy.Default.INJECTION) .getLoaded() .getDeclaredConstructor() .newInstance(); @@ -339,7 +338,7 @@ public static SchemaUserTypeCreator createStaticCreator( .make() .load( ReflectHelpers.findClassLoader(clazz.getClassLoader()), - getClassLoadingStrategy(clazz)) + ClassLoadingStrategy.Default.INJECTION) .getLoaded() .getDeclaredConstructor() .newInstance(); diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/POJOUtils.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/POJOUtils.java index 47e2b4eec5f19..46970c6bc4f6f 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/POJOUtils.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/POJOUtils.java @@ -17,8 +17,6 @@ */ package org.apache.beam.sdk.schemas.utils; -import static org.apache.beam.sdk.util.ByteBuddyUtils.getClassLoadingStrategy; - import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -158,7 +156,7 @@ private static SchemaUserTypeCreator createSetFieldCreator( .make() .load( ReflectHelpers.findClassLoader(clazz.getClassLoader()), - getClassLoadingStrategy(clazz)) + ClassLoadingStrategy.Default.INJECTION) .getLoaded() .getDeclaredConstructor() .newInstance(); @@ -210,7 +208,7 @@ public static SchemaUserTypeCreator createConstructorCreator( .make() .load( ReflectHelpers.findClassLoader(clazz.getClassLoader()), - getClassLoadingStrategy(clazz)) + ClassLoadingStrategy.Default.INJECTION) .getLoaded() .getDeclaredConstructor() .newInstance(); @@ -301,7 +299,7 @@ public static SchemaUserTypeCreator createStaticCreator( .make() .load( ReflectHelpers.findClassLoader(field.getDeclaringClass().getClassLoader()), - getClassLoadingStrategy(field.getDeclaringClass())) + ClassLoadingStrategy.Default.INJECTION) .getLoaded() .getDeclaredConstructor() .newInstance(); @@ -381,7 +379,7 @@ private static FieldValueSetter createSetter( .make() .load( ReflectHelpers.findClassLoader(field.getDeclaringClass().getClassLoader()), - getClassLoadingStrategy(field.getDeclaringClass())) + ClassLoadingStrategy.Default.INJECTION) .getLoaded() .getDeclaredConstructor() .newInstance(); diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/SelectByteBuddyHelpers.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/SelectByteBuddyHelpers.java index ec3db9b3cce4a..fd3b3735ee5ce 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/SelectByteBuddyHelpers.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/SelectByteBuddyHelpers.java @@ -17,7 +17,6 @@ */ package org.apache.beam.sdk.schemas.utils; -import static org.apache.beam.sdk.util.ByteBuddyUtils.getClassLoadingStrategy; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; import com.google.auto.value.AutoValue; @@ -37,6 +36,7 @@ import net.bytebuddy.description.type.TypeDescription.ForLoadedType; import net.bytebuddy.description.type.TypeDescription.Generic; import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.dynamic.scaffold.InstrumentedType; import net.bytebuddy.implementation.Implementation; import net.bytebuddy.implementation.Implementation.Context; @@ -66,7 +66,6 @@ import org.apache.beam.sdk.schemas.Schema.FieldType; import org.apache.beam.sdk.schemas.utils.ByteBuddyUtils.IfNullElse; import org.apache.beam.sdk.schemas.utils.ByteBuddyUtils.ShortCircuitReturnNull; -import org.apache.beam.sdk.util.common.ReflectHelpers; import org.apache.beam.sdk.values.Row; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Lists; @@ -178,9 +177,7 @@ static RowSelector createRowSelector(SchemaAndDescriptor schemaAndDescriptor) { return builder .visit(new AsmVisitorWrapper.ForDeclaredMethods().writerFlags(ClassWriter.COMPUTE_FRAMES)) .make() - .load( - ReflectHelpers.findClassLoader(schemaAndDescriptor.getClass().getClassLoader()), - getClassLoadingStrategy(schemaAndDescriptor.getClass())) + .load(Row.class.getClassLoader(), ClassLoadingStrategy.Default.INJECTION) .getLoaded() .getDeclaredConstructor(Schema.class) .newInstance(outputSchema); diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/ByteBuddyOnTimerInvokerFactory.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/ByteBuddyOnTimerInvokerFactory.java index 09e6212fa661f..49affe696e463 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/ByteBuddyOnTimerInvokerFactory.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/ByteBuddyOnTimerInvokerFactory.java @@ -17,7 +17,6 @@ */ package org.apache.beam.sdk.transforms.reflect; -import static org.apache.beam.sdk.util.ByteBuddyUtils.getClassLoadingStrategy; import static org.apache.beam.sdk.util.common.ReflectHelpers.findClassLoader; import java.lang.reflect.Constructor; @@ -28,6 +27,7 @@ import net.bytebuddy.description.modifier.Visibility; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.dynamic.scaffold.InstrumentedType; import net.bytebuddy.dynamic.scaffold.subclass.ConstructorStrategy; import net.bytebuddy.implementation.Implementation; @@ -225,7 +225,9 @@ public Constructor load(final OnTimerMethodSpecifier onTimerMethodSpecifier) Class> res = (Class>) unloaded - .load(findClassLoader(fnClass.getClassLoader()), getClassLoadingStrategy(fnClass)) + .load( + findClassLoader(fnClass.getClassLoader()), + ClassLoadingStrategy.Default.INJECTION) .getLoaded(); return res; } @@ -275,7 +277,9 @@ public Constructor load(final OnTimerMethodSpecifier onTimerMethodSpecifier) Class> res = (Class>) unloaded - .load(findClassLoader(fnClass.getClassLoader()), getClassLoadingStrategy(fnClass)) + .load( + findClassLoader(fnClass.getClassLoader()), + ClassLoadingStrategy.Default.INJECTION) .getLoaded(); return res; } diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/util/ByteBuddyUtils.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/util/ByteBuddyUtils.java deleted file mode 100644 index 3a7dd889d9584..0000000000000 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/util/ByteBuddyUtils.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.util; - -import static java.util.Objects.requireNonNull; - -import java.lang.reflect.Method; -import net.bytebuddy.dynamic.loading.ClassInjector; -import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; -import org.apache.beam.sdk.util.common.ReflectHelpers; - -/** Utilities for working with Byte Buddy. */ -public final class ByteBuddyUtils { - private ByteBuddyUtils() {} // Non-instantiable - - /** Returns a class loading strategy that is compatible with Java 17+. */ - public static ClassLoadingStrategy getClassLoadingStrategy(Class targetClass) { - try { - ClassLoadingStrategy strategy; - if (ClassInjector.UsingLookup.isAvailable()) { - ClassLoader classLoader = ReflectHelpers.findClassLoader(targetClass); - Class methodHandles = Class.forName("java.lang.invoke.MethodHandles", true, classLoader); - @SuppressWarnings("nullness") // MethodHandles#lookup accepts null - Object lookup = methodHandles.getMethod("lookup").invoke(null); - Class lookupClass = - Class.forName("java.lang.invoke.MethodHandles$Lookup", true, classLoader); - Method privateLookupIn = - methodHandles.getMethod("privateLookupIn", Class.class, lookupClass); - @SuppressWarnings("nullness") // this is a static method, the receiver can be null - Object privateLookup = requireNonNull(privateLookupIn.invoke(null, targetClass, lookup)); - strategy = ClassLoadingStrategy.UsingLookup.of(requireNonNull(privateLookup)); - } else if (ClassInjector.UsingReflection.isAvailable()) { - strategy = ClassLoadingStrategy.Default.INJECTION; - } else { - throw new IllegalStateException("No code generation strategy available"); - } - return strategy; - } catch (ReflectiveOperationException e) { - throw new IllegalStateException("No code generation strategy available", e); - } - } -}