支持 JNI-8 Lambda 吗?

Bra*_*don 4 java-native-interface java-8

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

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

Hol*_*ger 5

Lambda 表达式是编译时 Java 语言级别的工件。Java 编译器将表达式编译为合成方法并生成创建函数接口实例所需的代码,该实例的单个抽象方法将调用该方法。

由于 JNI 是一个运行时接口,因此从 JNI 的角度来看,没有比 lambda 表达式这样的东西。只有 JRE 生成的函数式接口实现会执行预先构建的方法。创建它们是为了实现 lambda 表达式、方法引用,或者只是手动创建,因为创建工具是公共 JRE API 的一部分。

“调用 lambda”非常简单,因为“调用 lambda”意味着在这样一个生成的实例上调用函数接口的单个​​抽象接口方法。不需要任何特殊的 JNI 函数,就像不需要特殊的 Java 语言功能来调用该方法一样。

JNI 在生成lambda 方面可以做的是告诉 JRE 生成将调用指定方法的函数式接口实现。如果该目标方法是 Java 编译器为 lambda 表达式生成的合成方法,那么您已经通过 JNI 创建了一个 lambda。否则,生成的实例的行为就像是对目标方法的方法引用。

这个答案展示了如何使用纯 Java 代码生成这样的实例。其中大部分由 JNI 也可以调用的普通方法调用组成。唯一棘手的部分被调用由表示的工厂方法MethodHandle通过返回CallSite。由于invokeinvokeExact不能被 JNI 调用invokeWithArguments,因此您必须在创建的最后一步调用。

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

请注意,这甚至不是全新的东西。Java 7 中已经存在一个有限的前身