«这个答案»包含一个代码示例,演示如何使用相同的功能将a转换为功能实现,Java 8的lambda表达式和方法引用使用。MethodHandle
interface
这一切都是为了使用方法句柄,所需的接口以及唯一方法的名称和所需的签名来调用LambdaMetafactory.metafactory
。abstract
该方法的文档和它的类文档都非常详细。
因此,对于您的请求,示例代码可能如下所示:
MethodType methodType = MethodType.methodType(Integer.class, String.class);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle handle = lookup.findStatic(Integer.class, "valueOf", methodType);
Function<String,Integer> f=(Function<String,Integer>)
LambdaMetafactory.metafactory(lookup, "apply",
MethodType.methodType(Function.class), methodType.generic(),
handle, methodType).getTarget().invokeExact();
System.out.println(f.apply("123"));
您必须关心此处的签名类型。第四个参数是指原始函数签名的方法类型,因此对于原始类型,我们必须在描述方法的同时实现。这就是为什么在 methodType 上调用该方法以获取将转换为 的第四个参数的原因。samMethodType
interface
Function
Object apply(Object)
instantiatedMethodType
Integer apply(String)
.generic()
(String)Integer
(Object)Object
这对于构造函数来说更加棘手,因为构造函数将使用类型进行查找,而函数类型与方法情况相同。因此,对于方法,该方法与构造函数的 while 匹配,我们必须使用不同的类型进行查找:(String)void
static
static
MethodType
MethodType
MethodType methodType = MethodType.methodType(Integer.class, String.class);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle handle = lookup.findConstructor(
Integer.class, MethodType.methodType(void.class, String.class));
Function<String,Integer> f=(Function<String,Integer>)
LambdaMetafactory.metafactory(lookup, "apply",
MethodType.methodType(Function.class), methodType.generic(),
handle, methodType).getTarget().invokeExact();
但这只是为了完整性,对于类型,你不应该调用构造函数,而最好使用方法。Integer
valueOf