问题标签 [invokedynamic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2632 浏览

java - 使用 ASM 生成工作调用动态指令

我正在通过ASM使用 Java 字节码,并试图让一个简单的invokedynamic示例正常运行。我觉得好像我从根本上误解了 invokedynamic 应该如何工作。这是我迄今为止尝试过的:

Test2.java我有一个我希望调用的静态方法和我的引导方法:

现在,在我使用 ASM生成一个在包中Test.java调用的类文件:Example.classpackage1

但是,当我尝试运行生成的类文件时,我收到以下信息:

invokedynamic用通常的调用(上面注释的行)替换调用invokestatic会产生预期的结果。从错误消息来看,在我看来,Handle代表我的引导方法 ( bootstrap) 的格式不正确,但我不能肯定地说。任何帮助将非常感激。我正在使用 ASM 4.1。

0 投票
3 回答
3872 浏览

java - 使用 java.lang.invoke.MethodHandle 调用私有方法

如何使用方法句柄调用私有方法?

据我所知,只有两种可公开访问的Lookup实例:

  • MethodHandles.lookup()
  • MethodHandles.publicLookup()

并且两者都不允许不受限制的私人访问。

有非公众Lookup.IMPL_LOOKUP做我想做的事。是否有一些公开的方式来获取它(假设 SecurityManager 允许它)?

0 投票
2 回答
422 浏览

java - 如何使用invokedynamic来执行多态的方法?

在所有变量都声明为的 Java 动态语言中java.lang.Object,我需要调用 Java 内置类。例如,java.math.BigDecimal构造函数可以接受数字、字符串等。

有没有java.lang.invoke我可以用来生成合适的MethodHandleMethodHandle应该接受一个作为它的java.lang.Object参数,但是当被调用时,它应该调用正确的构造函数。

0 投票
1 回答
361 浏览

ruby - jrubyc 在 linux 中因调用动态参数而失败

我在窗口中做得很好,但在 linux 中失败了。我想要做的是使用 -Xcompile.invokedynamic=true 参数将 ruby​​ 脚本编译为 java 字节码:

如果没有 -Xcompile.invokedynamic=true,jrubyc 可以工作,但生成的字节码中没有任何 invokedynamic 指令。还,

在窗口中工作,我在窗口的类文件中看到了 invokedynamic。

我将所有其他 jrubyc 属性(.jrubyrc)保留为默认值

hello.rb 是一行 ruby​​ 脚本:

我也试过 jrubyc 1.7.6 和同样的错误。任何人都可以提供一些线索吗?

[更新]:

最后,我认为异常表明 jrubyc 不支持 -Xcompile.invokedynamic=true 选项。jruby wiki 页面说 jruby,而不是“jrubyc”可以使用选项。

0 投票
1 回答
519 浏览

java - 引导方法如何注册到 Java 中的常量池?

我最近一直在寻找invokedynamicMethodHandles信息。

似乎 BOTHLinkage.registerBootstrapMethod()@BootstrapMethod都被弃用作为标记引导方法的手段。

它们是如何注册到常量池的?

0 投票
1 回答
1812 浏览

java - 如何使用 Object[] 数组调用 MethodHandle.invokeExact()?

Java 的 MethodHandle.invokeExact(Object...args) 采用可变长度的参数列表。但是,当我尝试传递 Object [] 数组而不是列表时,出现错误。见下文:

第二次调用 invokeExact() 产生此异常:

这可能与两年前修复的 Eclipse 中的错误有关(https://bugs.eclipse.org/bugs/show_bug.cgi?id=385404)但我不这么认为,因为当我关闭 Eclipse 时,删除 /target 目录,使用 Maven 重新编译所有内容,然后从命令行运行我得到相同的结果。

我正在使用 Eclipse Kepler SR2,一切都是最新的,以及 JDK 1.7.0_25。

0 投票
1 回答
439 浏览

jvm - 如何在 Jasmin 中使用 invokedynamic?

这里说:

因此,我认为可以使用 jasmin 编写包含调用动力学的指令代码。但是我找不到关于 jasmin 语法的任何文档,我只是想出了如何使用 invokedynamic 来获取 Jasmin 的 VerifyErrors,但不知道如何创建一个工作示例。

这个指令如何在 Jasmin 中正确使用?

0 投票
1 回答
540 浏览

dynamic - invokedynamic 什么时候真正有用(除了惰性常量)?

TL;博士

请提供一段用一些众所周知的动态语言(例如 JavaScript)编写的代码,以及该代码在使用 invokedynamic 的 Java 字节码中的样子,并解释为什么使用 invokedynamic 是向前迈出的一步。

背景

我已经用谷歌搜索并阅读了很多关于不再是新的调用动态指令的信息,互联网上的每个人都同意它有助于加速 JVM 上的动态语言。感谢 stackoverflow,我设法让我自己的字节码指令与 Sable/Jasmin 一起运行。

我已经了解 invokedynamic 对于惰性常量很有用,我还认为我了解OpenJDK 如何利用 invokedynamic 进行 lambdas

Oracle有一个小例子,但据我所知,在这种情况下使用invokedynamic会破坏目的,因为“加法器”的例子可能更简单、更快,并且效果与以下字节码表达的效果大致相同:

因为由于某种原因,Oracle 的引导方法知道两个参数都是整数。他们甚至“承认”:

[..] 它假定参数 [..] 将是 Integer 对象。如果引导方法的参数(在本例中为 callerClass、dynMethodName 和 dynMethodType)不同,则引导方法需要额外的代码来正确链接 invokedynamic [..]。

好吧,是的,如果没有那个有趣的“附加代码”,那么在这里使用 invokedynamic 是没有意义的,是吗?

因此,在那之后以及一些进一步的 Javadoc 和博客条目之后,我认为我已经很好地掌握了如何使用 invokedynamic 作为一个糟糕的替代品,而 invokestatic/invokevirtual/invokevirtual 或 getfield 也可以正常工作。

现在我很好奇如何将invokedynamic指令实际应用到现实世界的用例中,以便它实际上是对“传统”调用的一些改进(除了惰性常量,我得到了那些......)。

0 投票
0 回答
444 浏览

grails - 将 Grails 与 Groovy 的调用动态特性一起使用

在 Groovy 2.1 中,添加了对invokedynamic(参见此处此处)的完全支持。

为了使用此功能,看起来需要 JDK7 和“indy”Groovy jar。

我正在使用带有 JDK7 和 Groovy 2.3 的 Grails 2.4.3,所以看起来这应该是可能的,而且它似乎也有助于 Grails 的性能。

我的问题是:Grails 可以利用它吗?如果可以,如何使用?

是不久前的一个类似问题,涵盖了类似的领域。

0 投票
1 回答
7526 浏览

java - BootstrapMethodError caused by LambdaConversionException caused by using MethodHandle::invokeExact as a method reference

I was trying to check if it is possible to use MethodHandle::invoke or MethodHandle::invokeExact as method references for a functional interface that accepts a MethodHandle and returns a generified output.

(I know that invoke and invokeExact are signature polymorphic, hence the metafactory call in InvokeExact. However, I wanted to know if the compiler is able to elide the things that I had to do to derive a suitable version of invoke/invokeExact.)

invoke.InvokeExact0

Result

The good news is that the metafactory approach was able to synthesize a working functional interface instance (as printed: invoke.InvokeExact0$$Lambda$1/1878246837@1be6f5c3). The bad news is that the method reference approach resulted in a LambdaConversionException, which in turn resulted in a BootstrapMethodError.

I would then like to ask how I am supposed to interpret the error details in LambdaConversionException, since the metafactory workaround exists anyway.