现在Java8已经在这里正式发布了:http://www.oracle.com/technetwork/java/javase/downloads/index.html
有人知道我们是否可以实例化java或从JNI调用它们吗?关于如何使用Lambdas和Java中的所有新特性,有很多文档,但JNI :S没有。
发布于 2014-05-14 09:29:42
Lambda表达式是编译时Java语言级工件。Java编译器将将表达式编译为合成方法,并生成创建函数接口实例所需的代码,函数接口的单个抽象方法将调用该方法。
因为JNI是一个运行时接口,所以从JNI的角度来看,没有比lambda表达式更好的东西了。只有JRE生成的功能接口实现可以执行预构建的方法。它们可能是为了实现lambda表达式、方法引用而创建的,或者只是手动创建的,因为创建工具是公共JRE的一部分。
“调用lambda”非常简单,因为“调用lambda”意味着在这样一个生成的实例上调用函数接口的单个抽象接口方法。不需要任何特殊的JNI函数,就像不需要使用特殊的Java语言特性来调用该方法一样。
JNI在生成lambda时所能做的就是告诉JRE生成一个函数接口实现,该实现将调用指定的方法。如果目标方法是由Java编译器为lambda表达式生成的合成方法,那么您已经通过JNI创建了lambda。否则,生成的实例将表现为对目标方法的方法引用。
这个答案展示了如何使用纯Java代码生成这样的实例。它大部分由普通的方法调用组成,JNI也可以调用这些调用。唯一棘手的部分是调用由MethodHandle返回的CallSite表示的工厂方法。由于JNI不能调用invoke和invokeExact,所以必须在创建的最后一步调用invokeWithArguments。
总之,创建过程的中心是方法LambdaMetafactory.metafactory,它通常用作invokedynamic指令的引导方法,但也可以像普通方法一样调用,包括通过JNI调用。它的文档以及这是类文档都相当全面。
请注意,这甚至不是一个全新的东西。有限的前身已经存在于Java7中。
https://stackoverflow.com/questions/22542367
复制相似问题