什么是引导方法?

Bio*_*441 11 java

我一直在阅读关于java8 lambdas实现的演示文稿http://fr.slideshare.net/czechscala/java-8-under-the-hood

LambdaMetaFactory包含用于将lambda表达式转换为功能接口对象的引导方法.

这些bootstrap methods是什么,它们是否相关invokedynamic

Tal*_*nac 7

invokedynamic是用于内JVM调用任意方法的字节码操作。要调用和执行的确切方法在编译时是未知的。相反,它由实现CallSite的对象计算。因此,invokedynamic 中的动态

CallSite 对象和其他任何对象一样,必须被实例化。Boostrap Method是一种实例化 CallSite 对象的方法。

每个调用动态都有一个已知的引导方法,作为其编译时参数。每当第一次处理调用动态时,就会调用适当的引导程序方法。作为 boostrap 方法执行的结果,会创建一个 CallSite 对象。这个 CallSite 对象然后被 JVM 缓存并关联到给定的调用动态操作。从现在开始,每当要执行特定的调用动态调用时,都会使用缓存的 CallSite 实例来解析被调用的方法。

大多数 boostrap 方法不是由最终 Java 程序员直接编写的。然而,这并不意味着它们是一些罕见的晦涩机制。只要在源代码中使用特定的 java 语句,它们就会由 javac 编译器创建。想到字符串连接或 lambda 表达式。

例如,可以将 lambda 表达式实现为内部类。事实上,lambda 表达式是向程序员提供的“使用内部类的速记”。然而,实际的javac 实现,出于性能原因,通过在静态方法下生成lambda 代码并使用invokedynamic 来调用此方法来避免内部类。

为了更直接、更令人印象深刻地使用invokedynamic,我推荐Charles Nutter 博客,介绍他如何使用这种机制优化JRuby 调用站点。虽然编写 RubyVM 不是 Java 程序员通常的活动,但它确实让我们大开眼界,了解如何正确使用 invokedynamic。


Aar*_*lla 4

该类中只有两个方法:https ://docs.oracle.com/javase/8/docs/api/java/lang/invoke/LambdaMetafactory.html

metafactory()altMetafactory()。两者都提到是“用于调用动态调用站点的引导方法”。

我的理解是,invokedynamic当调用的目标是 lambda 表达式时,实现操作代码处理的代码最终会使用两者之一。

在这种情况下,术语“引导”意味着它准备好稍后实际执行作业所需的一切。