This is an automated email from the ASF dual-hosted git repository. rskraba pushed a commit to branch branch-1.9 in repository https://gitbox.apache.org/repos/asf/avro.git
commit 4adc7f21cc4ddc3820829c9f247fb8dc10e6715b Author: RyanSkraba <[email protected]> AuthorDate: Tue Feb 4 17:32:30 2020 +0100 AVRO-2725: Use one ReflectionUtil for utilities. (#797) * AVRO-2725: Use one ReflectionUtil for utilities. * Apply spotless. --- .../java/org/apache/avro/io/FastReaderBuilder.java | 3 +- .../java/org/apache/avro/io/ReflectionUtils.java | 73 ---------------------- .../org/apache/avro/reflect/ReflectionUtil.java | 50 ++++++++++++++- 3 files changed, 50 insertions(+), 76 deletions(-) diff --git a/lang/java/avro/src/main/java/org/apache/avro/io/FastReaderBuilder.java b/lang/java/avro/src/main/java/org/apache/avro/io/FastReaderBuilder.java index 40a612c..f6e1ed5 100644 --- a/lang/java/avro/src/main/java/org/apache/avro/io/FastReaderBuilder.java +++ b/lang/java/avro/src/main/java/org/apache/avro/io/FastReaderBuilder.java @@ -49,6 +49,7 @@ import org.apache.avro.generic.GenericFixed; import org.apache.avro.generic.IndexedRecord; import org.apache.avro.io.FastReaderBuilder.RecordReader.Stage; import org.apache.avro.io.parsing.ResolvingGrammarGenerator; +import org.apache.avro.reflect.ReflectionUtil; import org.apache.avro.specific.SpecificData; import org.apache.avro.specific.SpecificRecordBase; import org.apache.avro.util.Utf8; @@ -435,7 +436,7 @@ public class FastReaderBuilder { return stringReader; } else { Function<String, ?> transformer = findClass(valueClass) - .map(clazz -> ReflectionUtils.getConstructorAsFunction(String.class, clazz)).orElse(null); + .map(clazz -> ReflectionUtil.getConstructorAsFunction(String.class, clazz)).orElse(null); if (transformer != null) { return (old, decoder) -> transformer.apply((String) stringReader.read(null, decoder)); } diff --git a/lang/java/avro/src/main/java/org/apache/avro/io/ReflectionUtils.java b/lang/java/avro/src/main/java/org/apache/avro/io/ReflectionUtils.java deleted file mode 100644 index 53faec0..0000000 --- a/lang/java/avro/src/main/java/org/apache/avro/io/ReflectionUtils.java +++ /dev/null @@ -1,73 +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.avro.io; - -import java.lang.invoke.CallSite; -import java.lang.invoke.LambdaMetafactory; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.util.function.Function; -import java.util.function.Supplier; - -public class ReflectionUtils { - - private ReflectionUtils() { - // static helper class, don't initiate - } - - public static <D> Supplier<D> getConstructorAsSupplier(Class<D> clazz) { - try { - MethodHandles.Lookup lookup = MethodHandles.lookup(); - MethodHandle constructorHandle = lookup.findConstructor(clazz, MethodType.methodType(void.class)); - - CallSite site = LambdaMetafactory.metafactory(lookup, "get", MethodType.methodType(Supplier.class), - constructorHandle.type().generic(), constructorHandle, constructorHandle.type()); - - return (Supplier<D>) site.getTarget().invokeExact(); - } catch (Throwable t) { - // if anything goes wrong, don't provide a Supplier - return null; - } - } - - public static <V, R> Supplier<R> getOneArgConstructorAsSupplier(Class<R> clazz, Class<V> argumentClass, V argument) { - Function<V, R> supplierFunction = getConstructorAsFunction(argumentClass, clazz); - if (supplierFunction != null) { - return () -> supplierFunction.apply(argument); - } else { - return null; - } - } - - public static <V, R> Function<V, R> getConstructorAsFunction(Class<V> parameterClass, Class<R> clazz) { - try { - MethodHandles.Lookup lookup = MethodHandles.lookup(); - MethodHandle constructorHandle = lookup.findConstructor(clazz, MethodType.methodType(void.class, parameterClass)); - - CallSite site = LambdaMetafactory.metafactory(lookup, "apply", MethodType.methodType(Function.class), - constructorHandle.type().generic(), constructorHandle, constructorHandle.type()); - - return (Function<V, R>) site.getTarget().invokeExact(); - } catch (Throwable t) { - // if something goes wrong, do not provide a Function instance - return null; - } - } - -} diff --git a/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectionUtil.java b/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectionUtil.java index b3bace4..18ad475 100644 --- a/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectionUtil.java +++ b/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectionUtil.java @@ -19,11 +19,18 @@ package org.apache.avro.reflect; import org.apache.avro.AvroRuntimeException; +import java.lang.invoke.CallSite; +import java.lang.invoke.LambdaMetafactory; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.util.IdentityHashMap; import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; /** * A few utility methods for using @link{java.misc.Unsafe}, mostly for private @@ -32,9 +39,9 @@ import java.util.Map; * Use of Unsafe on Android is forbidden, as Android provides only a very * limited functionality for this class compared to the JDK version. * + * InterfaceAudience.Private */ - -class ReflectionUtil { +public class ReflectionUtil { private ReflectionUtil() { } @@ -156,4 +163,43 @@ class ReflectionUtil { return reuse; } + private static <D> Supplier<D> getConstructorAsSupplier(Class<D> clazz) { + try { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodHandle constructorHandle = lookup.findConstructor(clazz, MethodType.methodType(void.class)); + + CallSite site = LambdaMetafactory.metafactory(lookup, "get", MethodType.methodType(Supplier.class), + constructorHandle.type().generic(), constructorHandle, constructorHandle.type()); + + return (Supplier<D>) site.getTarget().invokeExact(); + } catch (Throwable t) { + // if anything goes wrong, don't provide a Supplier + return null; + } + } + + private static <V, R> Supplier<R> getOneArgConstructorAsSupplier(Class<R> clazz, Class<V> argumentClass, V argument) { + Function<V, R> supplierFunction = getConstructorAsFunction(argumentClass, clazz); + if (supplierFunction != null) { + return () -> supplierFunction.apply(argument); + } else { + return null; + } + } + + public static <V, R> Function<V, R> getConstructorAsFunction(Class<V> parameterClass, Class<R> clazz) { + try { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodHandle constructorHandle = lookup.findConstructor(clazz, MethodType.methodType(void.class, parameterClass)); + + CallSite site = LambdaMetafactory.metafactory(lookup, "apply", MethodType.methodType(Function.class), + constructorHandle.type().generic(), constructorHandle, constructorHandle.type()); + + return (Function<V, R>) site.getTarget().invokeExact(); + } catch (Throwable t) { + // if something goes wrong, do not provide a Function instance + return null; + } + } + }
