gpt4 book ai didi

java-native-interface - 支持 JNI-8 Lambda 吗?

转载 作者:行者123 更新时间:2023-12-01 23:58:35 24 4
gpt4 key购买 nike

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

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

最佳答案

Lambda 表达式是编译时 Java 语言级别的工件。 Java 编译器会将表达式编译为 synthetic方法并生成创建功能接口(interface)实例所需的代码,该接口(interface)的单个​​抽象方法将调用该方法。

由于 JNI 是一个运行时接口(interface),因此从 JNI 的角度来看,除了 lambda 表达式之外没有其他东西。只有 JRE 生成的功能接口(interface)的实现将执行预构建的方法。创建它们可能是为了实现 lambda 表达式、方法引用,或者只是手动创建,因为创建工具是公共(public) JRE API 的一部分。

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

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

This answer展示了如何使用纯 Java 代码生成这样的实例。其中大部分由 JNI 调用的普通方法调用组成。唯一棘手的部分是调用由 MethodHandle 表示的工厂方法。由 CallSite 返回.由于invokeinvokeExact JNI 不能调用你必须调用 invokeWithArguments 为创作的最后一步。

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

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

关于java-native-interface - 支持 JNI-8 Lambda 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22542367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com