Java 需要呼叫站点解释

Java 需要呼叫站点解释,java,lambda,java-8,Java,Lambda,Java 8,从文件中 调用站点是变量MethodHandle的持有者,称为其目标。链接到CallSite的InvokedDynamic指令将所有调用委托给站点的当前目标。一个调用站点可能与几个invokedynamic指令相关联,也可能是“自由浮动”的,不与任何指令相关联。在任何情况下,都可以通过称为其动态调用器的关联方法句柄调用它 问题: CallSite中的目标是否可以更改?怎样?请提供一个代码示例 调用站点如何与多个invokedynamic指令关联 什么是“自由浮动”呼叫站点?如何创建它 编辑

从文件中

调用站点是变量MethodHandle的持有者,称为其目标。链接到CallSite的InvokedDynamic指令将所有调用委托给站点的当前目标。一个调用站点可能与几个invokedynamic指令相关联,也可能是“自由浮动”的,不与任何指令相关联。在任何情况下,都可以通过称为其动态调用器的关联方法句柄调用它

问题:

  • CallSite中的目标是否可以更改?怎样?请提供一个代码示例

  • 调用站点如何与多个
    invokedynamic
    指令关联

  • 什么是“自由浮动”呼叫站点?如何创建它

  • 编辑: 注意:我想知道编写代码/lambda的不同方法,以便在程序中出现这三点

  • 对。a或a中的目标可以通过
  • JVM规范定义了如何初始化动态计算的调用站点。但要回答这个问题,我认为这是故意的。i、 JVM规范说它应该用于JVM实现,编译器可能会出于自身的优势使用它
  • 您不会像编译器那样直接在代码中创建调用站点,它只是声明可能存在“自由浮动”的
    CallSite
    s

  • 编辑:我认为您误解了文档,我认为您永远不应该直接从您的代码初始化
    CallSite
    ,因为它没有任何用处,文档的存在是为了告知它的功能,JVM使用它为
    invokedynamic
    指令提供方法句柄。

    我的问题更多的是关于如何在代码中实现它?正如您所说,CallSite不应由开发人员创建,因此我想知道如何编写代码,以便编译器执行这三点。JSR贡献者创建了CallSites和InvokedDynamic“旨在增强JVM对动态类型语言的支持”由于
    LambdaMetafactory
    仅创建
    ConstantCallSite
    s,因此没有编译示例,我建议您看看。
    由于LambdaMetafactory仅创建ConstantCallSites,因此没有编译示例。你能分享一些链接来证明这一点吗?LambdaMetaFactory,非常棒。一个令人兴奋的问题:当说
    CallSite将返回
    或调用
    CallSite时
    是什么意思?获取CallSIte对象后,调用FunctionInterface方法时如何调用lambda desugared方法?1。答案是肯定的。从字面上回答其他问题:2。通过让bootstrap方法多次返回相同的
    CallSite
    实例。3.每个
    CallSite
    对象最初都是自由浮动的,直到在
    invokedynamic
    链接过程中由引导方法返回为止。如果你在这样的过程中不归还它,它将保持自由浮动。@Holger:现在清楚了。您能在下面答案的最后一条评论中回答我的问题吗?不清楚您在该评论中问了什么。@霍尔格:我想知道,当调用FunctionInterface的单个抽象方法时,调用如何转到desugared方法?正如其他评论所说,
    LambdaMetaFactory
    生成一个类。该类使用将调用目标方法的方法实现接口。