[reflect] Move lambda gen to LambdaFactory
This commit is contained in:
parent
ea06c7009d
commit
f9782a1ef5
|
@ -0,0 +1,79 @@
|
||||||
|
package io.gitlab.jfronny.commons.reflect;
|
||||||
|
|
||||||
|
import java.lang.invoke.*;
|
||||||
|
import java.util.function.*;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public class LambdaFactory {
|
||||||
|
private static final MethodHandles.Lookup LOOKUP_ROOT = MethodHandles.lookup();
|
||||||
|
|
||||||
|
public static MethodHandles.Lookup lookup(Class<?> klazz) throws IllegalAccessException {
|
||||||
|
return MethodHandles.privateLookupIn(klazz, LOOKUP_ROOT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Runnable runnable(MethodHandles.Lookup lookup, MethodHandle handle) throws Throwable {
|
||||||
|
return (Runnable) LambdaMetafactory.metafactory(
|
||||||
|
lookup,
|
||||||
|
"run",
|
||||||
|
MethodType.methodType(Runnable.class),
|
||||||
|
MethodType.methodType(Void.TYPE),
|
||||||
|
handle,
|
||||||
|
MethodType.methodType(Void.TYPE)
|
||||||
|
).getTarget().invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <TIn> Consumer<TIn> consumer(MethodHandles.Lookup lookup, MethodHandle handle, Class<TIn> parameterType) throws Throwable {
|
||||||
|
return (Consumer<TIn>) LambdaMetafactory.metafactory(
|
||||||
|
lookup,
|
||||||
|
"accept",
|
||||||
|
MethodType.methodType(Consumer.class),
|
||||||
|
MethodType.methodType(Void.TYPE, Object.class),
|
||||||
|
handle,
|
||||||
|
MethodType.methodType(Void.TYPE, parameterType)
|
||||||
|
).getTarget().invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <TIn1, TIn2> BiConsumer<TIn1, TIn2> consumer(MethodHandles.Lookup lookup, MethodHandle handle, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
||||||
|
return (BiConsumer<TIn1, TIn2>) LambdaMetafactory.metafactory(
|
||||||
|
lookup,
|
||||||
|
"accept",
|
||||||
|
MethodType.methodType(BiConsumer.class),
|
||||||
|
MethodType.methodType(Void.TYPE, Object.class, Object.class),
|
||||||
|
handle,
|
||||||
|
MethodType.methodType(Void.TYPE, parameterType1, parameterType2)
|
||||||
|
).getTarget().invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <TOut> Supplier<TOut> supplier(MethodHandles.Lookup lookup, MethodHandle handle, Class<TOut> returnType) throws Throwable {
|
||||||
|
return (Supplier<TOut>) LambdaMetafactory.metafactory(
|
||||||
|
lookup,
|
||||||
|
"get",
|
||||||
|
MethodType.methodType(Supplier.class),
|
||||||
|
MethodType.methodType(Object.class),
|
||||||
|
handle,
|
||||||
|
MethodType.methodType(returnType)
|
||||||
|
).getTarget().invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <TIn, TOut> Function<TIn, TOut> function(MethodHandles.Lookup lookup, MethodHandle handle, Class<TOut> returnType, Class<TIn> parameterType) throws Throwable {
|
||||||
|
return (Function<TIn, TOut>) LambdaMetafactory.metafactory(
|
||||||
|
lookup,
|
||||||
|
"apply",
|
||||||
|
MethodType.methodType(Function.class),
|
||||||
|
MethodType.methodType(Object.class, Object.class),
|
||||||
|
handle,
|
||||||
|
MethodType.methodType(returnType, parameterType)
|
||||||
|
).getTarget().invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <TIn1, TIn2, TOut> BiFunction<TIn1, TIn2, TOut> function(MethodHandles.Lookup lookup, MethodHandle handle, Class<TOut> returnType, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
||||||
|
return (BiFunction<TIn1, TIn2, TOut>) LambdaMetafactory.metafactory(
|
||||||
|
lookup,
|
||||||
|
"apply",
|
||||||
|
MethodType.methodType(BiFunction.class),
|
||||||
|
MethodType.methodType(Object.class, Object.class, Object.class),
|
||||||
|
handle,
|
||||||
|
MethodType.methodType(returnType, parameterType1, parameterType2)
|
||||||
|
).getTarget().invoke();
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,108 +4,78 @@ import io.gitlab.jfronny.commons.throwable.ThrowingBiFunction;
|
||||||
import io.gitlab.jfronny.commons.throwable.ThrowingFunction;
|
import io.gitlab.jfronny.commons.throwable.ThrowingFunction;
|
||||||
import io.gitlab.jfronny.commons.throwable.ThrowingSupplier;
|
import io.gitlab.jfronny.commons.throwable.ThrowingSupplier;
|
||||||
|
|
||||||
import java.lang.invoke.*;
|
import java.lang.invoke.MethodHandles;
|
||||||
import java.util.function.*;
|
import java.util.function.*;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class Reflect {
|
public class Reflect {
|
||||||
private static final MethodHandles.Lookup LOOKUP_ROOT = MethodHandles.lookup();
|
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static <TOut> ThrowingSupplier<TOut, ReflectiveOperationException> getConstructor(Class<?> toConstruct) throws Throwable {
|
public static <TOut> ThrowingSupplier<TOut, ReflectiveOperationException> getConstructor(Class<TOut> toConstruct) throws Throwable {
|
||||||
Supplier<TOut> constructor = constructor(toConstruct);
|
Supplier<TOut> constructor = constructor(toConstruct);
|
||||||
return constructor::get;
|
return constructor::get;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static <TOut> ThrowingSupplier<TOut, ReflectiveOperationException> getConstructor(String targetClassName) throws Throwable {
|
public static <TOut> ThrowingSupplier<TOut, ReflectiveOperationException> getConstructor(String targetClassName) throws Throwable {
|
||||||
return getConstructor(Class.forName(targetClassName));
|
return Reflect.getConstructor((Class<TOut>) Class.forName(targetClassName));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static <TIn, TOut> ThrowingFunction<TIn, TOut, ReflectiveOperationException> getConstructor(Class<?> toConstruct, Class<TIn> parameterType) throws Throwable {
|
public static <TIn, TOut> ThrowingFunction<TIn, TOut, ReflectiveOperationException> getConstructor(Class<TOut> toConstruct, Class<TIn> parameterType) throws Throwable {
|
||||||
Function<TIn, TOut> constructor = constructor(toConstruct, parameterType);
|
Function<TIn, TOut> constructor = constructor(toConstruct, parameterType);
|
||||||
return constructor::apply;
|
return constructor::apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static <TIn, TOut> ThrowingFunction<TIn, TOut, ReflectiveOperationException> getConstructor(String targetClassName, Class<TIn> parameterType) throws Throwable {
|
public static <TIn, TOut> ThrowingFunction<TIn, TOut, ReflectiveOperationException> getConstructor(String targetClassName, Class<TIn> parameterType) throws Throwable {
|
||||||
return getConstructor(Class.forName(targetClassName), parameterType);
|
return getConstructor((Class<TOut>) Class.forName(targetClassName), parameterType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static <TIn1, TIn2, TOut> ThrowingBiFunction<TIn1, TIn2, TOut, ReflectiveOperationException> getConstructor(Class<?> toConstruct, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
public static <TIn1, TIn2, TOut> ThrowingBiFunction<TIn1, TIn2, TOut, ReflectiveOperationException> getConstructor(Class<TOut> toConstruct, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
||||||
BiFunction<TIn1, TIn2, TOut> constructor = constructor(toConstruct, parameterType1, parameterType2);
|
BiFunction<TIn1, TIn2, TOut> constructor = constructor(toConstruct, parameterType1, parameterType2);
|
||||||
return constructor::apply;
|
return constructor::apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static <TIn1, TIn2, TOut> ThrowingBiFunction<TIn1, TIn2, TOut, ReflectiveOperationException> getConstructor(String targetClassName, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
public static <TIn1, TIn2, TOut> ThrowingBiFunction<TIn1, TIn2, TOut, ReflectiveOperationException> getConstructor(String targetClassName, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
||||||
return getConstructor(Class.forName(targetClassName), parameterType1, parameterType2);
|
return getConstructor((Class<TOut>) Class.forName(targetClassName), parameterType1, parameterType2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constructor without parameters
|
// Constructor without parameters
|
||||||
public static <TOut> Supplier<TOut> constructor(Class<?> toConstruct) throws Throwable {
|
public static <TOut> Supplier<TOut> constructor(Class<TOut> toConstruct) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(toConstruct, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(toConstruct);
|
||||||
return (Supplier<TOut>) LambdaMetafactory.metafactory(
|
return LambdaFactory.supplier(lookup, lookup.unreflectConstructor(toConstruct.getDeclaredConstructor()), toConstruct);
|
||||||
lookup,
|
|
||||||
"get",
|
|
||||||
MethodType.methodType(Supplier.class),
|
|
||||||
MethodType.methodType(Object.class),
|
|
||||||
lookup.unreflectConstructor(toConstruct.getDeclaredConstructor()),
|
|
||||||
MethodType.methodType(toConstruct)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TOut> Supplier<TOut> constructor(String targetClassName) throws Throwable {
|
public static <TOut> Supplier<TOut> constructor(String targetClassName) throws Throwable {
|
||||||
return constructor(Class.forName(targetClassName));
|
return (Supplier<TOut>) constructor(Class.forName(targetClassName));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constructor with one parameter
|
// Constructor with one parameter
|
||||||
public static <TIn, TOut> Function<TIn, TOut> constructor(Class<?> toConstruct, Class<TIn> parameterType) throws Throwable {
|
public static <TIn, TOut> Function<TIn, TOut> constructor(Class<TOut> toConstruct, Class<TIn> parameterType) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(toConstruct, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(toConstruct);
|
||||||
return (Function<TIn, TOut>) LambdaMetafactory.metafactory(
|
return LambdaFactory.function(lookup, lookup.unreflectConstructor(toConstruct.getDeclaredConstructor(parameterType)), toConstruct, parameterType);
|
||||||
lookup,
|
|
||||||
"apply",
|
|
||||||
MethodType.methodType(Function.class),
|
|
||||||
MethodType.methodType(Object.class, Object.class),
|
|
||||||
lookup.unreflectConstructor(toConstruct.getDeclaredConstructor(parameterType)),
|
|
||||||
MethodType.methodType(toConstruct, parameterType)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TIn, TOut> Function<TIn, TOut> constructor(String targetClassName, Class<TIn> parameterType) throws Throwable {
|
public static <TIn, TOut> Function<TIn, TOut> constructor(String targetClassName, Class<TIn> parameterType) throws Throwable {
|
||||||
return constructor(Class.forName(targetClassName), parameterType);
|
return (Function<TIn, TOut>) constructor(Class.forName(targetClassName), parameterType);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constructor with two parameters
|
// Constructor with two parameters
|
||||||
public static <TIn1, TIn2, TOut> BiFunction<TIn1, TIn2, TOut> constructor(Class<?> toConstruct, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
public static <TIn1, TIn2, TOut> BiFunction<TIn1, TIn2, TOut> constructor(Class<TOut> toConstruct, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(toConstruct, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(toConstruct);
|
||||||
return (BiFunction<TIn1, TIn2, TOut>) LambdaMetafactory.metafactory(
|
return LambdaFactory.function(lookup, lookup.unreflectConstructor(toConstruct.getDeclaredConstructor(parameterType1, parameterType2)), toConstruct, parameterType1, parameterType2);
|
||||||
lookup,
|
|
||||||
"apply",
|
|
||||||
MethodType.methodType(BiFunction.class),
|
|
||||||
MethodType.methodType(Object.class, Object.class, Object.class),
|
|
||||||
lookup.unreflectConstructor(toConstruct.getDeclaredConstructor(parameterType1, parameterType2)),
|
|
||||||
MethodType.methodType(toConstruct, parameterType1, parameterType2)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TIn1, TIn2, TOut> BiFunction<TIn1, TIn2, TOut> constructor(String targetClassName, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
public static <TIn1, TIn2, TOut> BiFunction<TIn1, TIn2, TOut> constructor(String targetClassName, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
||||||
return constructor(Class.forName(targetClassName), parameterType1, parameterType2);
|
return constructor((Class<TOut>) Class.forName(targetClassName), parameterType1, parameterType2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Procedure without parameters
|
// Procedure without parameters
|
||||||
public static Runnable staticProcedure(Class<?> targetClass, String name) throws Throwable {
|
public static Runnable staticProcedure(Class<?> targetClass, String name) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(targetClass, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(targetClass);
|
||||||
return (Runnable) LambdaMetafactory.metafactory(
|
return LambdaFactory.runnable(lookup, lookup.unreflect(targetClass.getDeclaredMethod(name)));
|
||||||
lookup,
|
|
||||||
"run",
|
|
||||||
MethodType.methodType(Runnable.class),
|
|
||||||
MethodType.methodType(Void.TYPE),
|
|
||||||
lookup.unreflect(targetClass.getDeclaredMethod(name)),
|
|
||||||
MethodType.methodType(Void.TYPE)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Runnable staticProcedure(String targetClassName, String name) throws Throwable {
|
public static Runnable staticProcedure(String targetClassName, String name) throws Throwable {
|
||||||
|
@ -114,15 +84,8 @@ public class Reflect {
|
||||||
|
|
||||||
// Procedure with one parameter
|
// Procedure with one parameter
|
||||||
public static <TIn> Consumer<TIn> staticProcedure(Class<?> targetClass, String name, Class<TIn> parameterType) throws Throwable {
|
public static <TIn> Consumer<TIn> staticProcedure(Class<?> targetClass, String name, Class<TIn> parameterType) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(targetClass, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(targetClass);
|
||||||
return (Consumer<TIn>) LambdaMetafactory.metafactory(
|
return LambdaFactory.consumer(lookup, lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType)), parameterType);
|
||||||
lookup,
|
|
||||||
"accept",
|
|
||||||
MethodType.methodType(Consumer.class),
|
|
||||||
MethodType.methodType(Void.TYPE, Object.class),
|
|
||||||
lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType)),
|
|
||||||
MethodType.methodType(Void.TYPE, parameterType)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TIn> Consumer<TIn> staticProcedure(String targetClassName, String name, Class<TIn> parameterType) throws Throwable {
|
public static <TIn> Consumer<TIn> staticProcedure(String targetClassName, String name, Class<TIn> parameterType) throws Throwable {
|
||||||
|
@ -131,15 +94,8 @@ public class Reflect {
|
||||||
|
|
||||||
// Procedure with two parameters
|
// Procedure with two parameters
|
||||||
public static <TIn1, TIn2> BiConsumer<TIn1, TIn2> staticProcedure(Class<?> targetClass, String name, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
public static <TIn1, TIn2> BiConsumer<TIn1, TIn2> staticProcedure(Class<?> targetClass, String name, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(targetClass, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(targetClass);
|
||||||
return (BiConsumer<TIn1, TIn2>) LambdaMetafactory.metafactory(
|
return LambdaFactory.consumer(lookup, lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType1, parameterType2)), parameterType1, parameterType2);
|
||||||
lookup,
|
|
||||||
"accept",
|
|
||||||
MethodType.methodType(BiConsumer.class),
|
|
||||||
MethodType.methodType(Void.TYPE, Object.class, Object.class),
|
|
||||||
lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType1, parameterType2)),
|
|
||||||
MethodType.methodType(Void.TYPE, parameterType1, parameterType2)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TIn1, TIn2> BiConsumer<TIn1, TIn2> staticProcedure(String targetClassName, String name, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
public static <TIn1, TIn2> BiConsumer<TIn1, TIn2> staticProcedure(String targetClassName, String name, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
||||||
|
@ -148,15 +104,8 @@ public class Reflect {
|
||||||
|
|
||||||
// Function without parameters
|
// Function without parameters
|
||||||
public static <TOut> Supplier<TOut> staticFunction(Class<?> targetClass, String name, Class<TOut> returnType) throws Throwable {
|
public static <TOut> Supplier<TOut> staticFunction(Class<?> targetClass, String name, Class<TOut> returnType) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(targetClass, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(targetClass);
|
||||||
return (Supplier<TOut>) LambdaMetafactory.metafactory(
|
return LambdaFactory.supplier(lookup, lookup.unreflect(targetClass.getDeclaredMethod(name)), returnType);
|
||||||
lookup,
|
|
||||||
"get",
|
|
||||||
MethodType.methodType(Supplier.class),
|
|
||||||
MethodType.methodType(Object.class),
|
|
||||||
lookup.unreflect(targetClass.getDeclaredMethod(name)),
|
|
||||||
MethodType.methodType(returnType)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TOut> Supplier<TOut> staticFunction(String targetClassName, String name, Class<TOut> returnType) throws Throwable {
|
public static <TOut> Supplier<TOut> staticFunction(String targetClassName, String name, Class<TOut> returnType) throws Throwable {
|
||||||
|
@ -165,15 +114,8 @@ public class Reflect {
|
||||||
|
|
||||||
// Function with one parameter
|
// Function with one parameter
|
||||||
public static <TIn, TOut> Function<TIn, TOut> staticFunction(Class<?> targetClass, String name, Class<TOut> returnType, Class<TIn> parameterType) throws Throwable {
|
public static <TIn, TOut> Function<TIn, TOut> staticFunction(Class<?> targetClass, String name, Class<TOut> returnType, Class<TIn> parameterType) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(targetClass, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(targetClass);
|
||||||
return (Function<TIn, TOut>) LambdaMetafactory.metafactory(
|
return LambdaFactory.function(lookup, lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType)), returnType, parameterType);
|
||||||
lookup,
|
|
||||||
"apply",
|
|
||||||
MethodType.methodType(Function.class),
|
|
||||||
MethodType.methodType(Object.class, Object.class),
|
|
||||||
lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType)),
|
|
||||||
MethodType.methodType(returnType, parameterType)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TIn, TOut> Function<TIn, TOut> staticFunction(String targetClassName, String name, Class<TOut> returnType, Class<TIn> parameterType) throws Throwable {
|
public static <TIn, TOut> Function<TIn, TOut> staticFunction(String targetClassName, String name, Class<TOut> returnType, Class<TIn> parameterType) throws Throwable {
|
||||||
|
@ -182,15 +124,8 @@ public class Reflect {
|
||||||
|
|
||||||
// Function with two parameters
|
// Function with two parameters
|
||||||
public static <TIn1, TIn2, TOut> BiFunction<TIn1, TIn2, TOut> staticFunction(Class<?> targetClass, String name, Class<TOut> returnType, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
public static <TIn1, TIn2, TOut> BiFunction<TIn1, TIn2, TOut> staticFunction(Class<?> targetClass, String name, Class<TOut> returnType, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(targetClass, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(targetClass);
|
||||||
return (BiFunction<TIn1, TIn2, TOut>) LambdaMetafactory.metafactory(
|
return LambdaFactory.function(lookup, lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType1, parameterType2)), returnType, parameterType1, parameterType2);
|
||||||
lookup,
|
|
||||||
"apply",
|
|
||||||
MethodType.methodType(BiFunction.class),
|
|
||||||
MethodType.methodType(Object.class, Object.class, Object.class),
|
|
||||||
lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType1, parameterType2)),
|
|
||||||
MethodType.methodType(returnType, parameterType1, parameterType2)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TIn1, TIn2, TOut> BiFunction<TIn1, TIn2, TOut> staticFunction(String targetClassName, String name, Class<TOut> returnType, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
public static <TIn1, TIn2, TOut> BiFunction<TIn1, TIn2, TOut> staticFunction(String targetClassName, String name, Class<TOut> returnType, Class<TIn1> parameterType1, Class<TIn2> parameterType2) throws Throwable {
|
||||||
|
@ -199,15 +134,8 @@ public class Reflect {
|
||||||
|
|
||||||
// Procedure without parameters
|
// Procedure without parameters
|
||||||
public static <TTarget> Consumer<TTarget> instanceProcedure(Class<TTarget> targetClass, String name) throws Throwable {
|
public static <TTarget> Consumer<TTarget> instanceProcedure(Class<TTarget> targetClass, String name) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(targetClass, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(targetClass);
|
||||||
return (Consumer<TTarget>) LambdaMetafactory.metafactory(
|
return LambdaFactory.consumer(lookup, lookup.unreflect(targetClass.getDeclaredMethod(name)), targetClass);
|
||||||
lookup,
|
|
||||||
"accept",
|
|
||||||
MethodType.methodType(Consumer.class),
|
|
||||||
MethodType.methodType(Void.TYPE, Object.class),
|
|
||||||
lookup.unreflect(targetClass.getDeclaredMethod(name)),
|
|
||||||
MethodType.methodType(Void.TYPE, targetClass)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TTarget> Consumer<TTarget> instanceProcedure(String targetClassName, String name) throws Throwable {
|
public static <TTarget> Consumer<TTarget> instanceProcedure(String targetClassName, String name) throws Throwable {
|
||||||
|
@ -216,15 +144,8 @@ public class Reflect {
|
||||||
|
|
||||||
// Procedure with one parameter
|
// Procedure with one parameter
|
||||||
public static <TTarget, TIn> BiConsumer<TTarget, TIn> instanceProcedure(Class<TTarget> targetClass, String name, Class<TIn> parameterType) throws Throwable {
|
public static <TTarget, TIn> BiConsumer<TTarget, TIn> instanceProcedure(Class<TTarget> targetClass, String name, Class<TIn> parameterType) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(targetClass, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(targetClass);
|
||||||
return (BiConsumer<TTarget, TIn>) LambdaMetafactory.metafactory(
|
return LambdaFactory.consumer(lookup, lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType)), targetClass, parameterType);
|
||||||
lookup,
|
|
||||||
"accept",
|
|
||||||
MethodType.methodType(BiConsumer.class),
|
|
||||||
MethodType.methodType(Void.TYPE, Object.class, Object.class),
|
|
||||||
lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType)),
|
|
||||||
MethodType.methodType(Void.TYPE, targetClass, parameterType)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TTarget, TIn> BiConsumer<TTarget, TIn> instanceProcedure(String targetClassName, String name, Class<TIn> parameterType) throws Throwable {
|
public static <TTarget, TIn> BiConsumer<TTarget, TIn> instanceProcedure(String targetClassName, String name, Class<TIn> parameterType) throws Throwable {
|
||||||
|
@ -233,15 +154,8 @@ public class Reflect {
|
||||||
|
|
||||||
// Function without parameters
|
// Function without parameters
|
||||||
public static <TTarget, TOut> Function<TTarget, TOut> instanceFunction(Class<TTarget> targetClass, String name, Class<TOut> returnType) throws Throwable {
|
public static <TTarget, TOut> Function<TTarget, TOut> instanceFunction(Class<TTarget> targetClass, String name, Class<TOut> returnType) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(targetClass, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(targetClass);
|
||||||
return (Function<TTarget, TOut>) LambdaMetafactory.metafactory(
|
return LambdaFactory.function(lookup, lookup.unreflect(targetClass.getDeclaredMethod(name)), returnType, targetClass);
|
||||||
lookup,
|
|
||||||
"apply",
|
|
||||||
MethodType.methodType(Function.class),
|
|
||||||
MethodType.methodType(Object.class, Object.class),
|
|
||||||
lookup.unreflect(targetClass.getDeclaredMethod(name)),
|
|
||||||
MethodType.methodType(returnType, targetClass)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TTarget, TOut> Function<TTarget, TOut> instanceFunction(String targetClassName, String name, Class<TOut> returnType) throws Throwable {
|
public static <TTarget, TOut> Function<TTarget, TOut> instanceFunction(String targetClassName, String name, Class<TOut> returnType) throws Throwable {
|
||||||
|
@ -250,15 +164,8 @@ public class Reflect {
|
||||||
|
|
||||||
// Function with one parameter
|
// Function with one parameter
|
||||||
public static <TTarget, TIn, TOut> BiFunction<TTarget, TIn, TOut> instanceFunction(Class<TTarget> targetClass, String name, Class<TOut> returnType, Class<TIn> parameterType) throws Throwable {
|
public static <TTarget, TIn, TOut> BiFunction<TTarget, TIn, TOut> instanceFunction(Class<TTarget> targetClass, String name, Class<TOut> returnType, Class<TIn> parameterType) throws Throwable {
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(targetClass, LOOKUP_ROOT);
|
MethodHandles.Lookup lookup = LambdaFactory.lookup(targetClass);
|
||||||
return (BiFunction<TTarget, TIn, TOut>) LambdaMetafactory.metafactory(
|
return LambdaFactory.function(lookup, lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType)), returnType, targetClass, parameterType);
|
||||||
lookup,
|
|
||||||
"apply",
|
|
||||||
MethodType.methodType(BiFunction.class),
|
|
||||||
MethodType.methodType(Object.class, Object.class, Object.class),
|
|
||||||
lookup.unreflect(targetClass.getDeclaredMethod(name, parameterType)),
|
|
||||||
MethodType.methodType(returnType, targetClass, parameterType)
|
|
||||||
).getTarget().invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <TTarget, TIn, TOut> BiFunction<TTarget, TIn, TOut> instanceFunction(String targetClassName, String name, Class<TOut> returnType, Class<TIn> parameterType) throws Throwable {
|
public static <TTarget, TIn, TOut> BiFunction<TTarget, TIn, TOut> instanceFunction(String targetClassName, String name, Class<TOut> returnType, Class<TIn> parameterType) throws Throwable {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user