JNI-8 Lambdas支持吗?

时间:2014-03-20 18:45:57

标签: java-native-interface java-8

现在Java 8正式发布在这里:http://www.oracle.com/technetwork/java/javase/downloads/index.html

有没有人知道我们是否可以实例化java-lambdas或从JNI调用它们?有很多关于使用Lambdas和Java中所有新功能的文档,但JNI没有任何内容:S

1 个答案:

答案 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无法调用invokeinvokeExact,因此您必须在创建的最后一步调用invokeWithArguments

总结创建过程,它全部集中于方法LambdaMetafactory.metafactory,它通常用作invokedynamic指令的引导方法,但也可以像普通方法一样调用,包括通过JNI。它的文档以及it’s class documentation都非常全面。

请注意,这甚至不是一件全新的事情。 Java 7中已经存在A limited predecessor