现在Java 8正式发布在这里:http://www.oracle.com/technetwork/java/javase/downloads/index.html
有没有人知道我们是否可以实例化java-lambdas或从JNI调用它们?有很多关于使用Lambdas和Java中所有新功能的文档,但JNI没有任何内容:S
答案 0 :(得分:3)
Lambda表达式是一个编译时Java语言级别的工件。 Java编译器将表达式编译为synthetic方法,并生成创建功能接口实例所需的代码,其单个抽象方法将调用该方法。
由于JNI是运行时接口,因此从JNI的角度来看,没有lambda表达式。只有JRE生成的功能接口的实现才会执行预先构建的方法。可以创建它们以实现lambda表达式,方法引用,或者只是手动创建它们,因为创建工具是公共JRE API的一部分。
“调用lambda”非常简单,因为“调用lambda”意味着在这样生成的实例上调用功能接口的单个抽象接口方法。不需要任何特殊的JNI功能,就像不需要特殊的Java语言功能来调用那种方法一样。
JNI可以做什么生成 lambda正在告诉JRE生成一个功能接口实现,它将调用指定的方法。如果该目标方法是Java编译器为lambda表达式生成的合成方法,那么您已经通过JNI创建了一个lambda。否则,生成的实例将表现为对目标方法的方法引用。
This answer显示了如何使用纯Java代码生成这样的实例。其中大部分都包含普通方法调用,也可以由JNI调用。唯一棘手的部分是调用由MethodHandle
返回的CallSite
表示的工厂方法。由于JNI无法调用invoke
和invokeExact
,因此您必须在创建的最后一步调用invokeWithArguments
。
总结创建过程,它全部集中于方法LambdaMetafactory.metafactory
,它通常用作invokedynamic
指令的引导方法,但也可以像普通方法一样调用,包括通过JNI。它的文档以及it’s class documentation都非常全面。
请注意,这甚至不是一件全新的事情。 Java 7中已经存在A limited predecessor。