问题标签 [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.
java - 使用 ASM 生成工作调用动态指令
我正在通过ASM使用 Java 字节码,并试图让一个简单的invokedynamic
示例正常运行。我觉得好像我从根本上误解了 invokedynamic 应该如何工作。这是我迄今为止尝试过的:
在Test2.java
我有一个我希望调用的静态方法和我的引导方法:
现在,在我使用 ASM生成一个在包中Test.java
调用的类文件:Example.class
package1
但是,当我尝试运行生成的类文件时,我收到以下信息:
invokedynamic
用通常的调用(上面注释的行)替换调用invokestatic
会产生预期的结果。从错误消息来看,在我看来,Handle
代表我的引导方法 ( bootstrap
) 的格式不正确,但我不能肯定地说。任何帮助将非常感激。我正在使用 ASM 4.1。
java - 使用 java.lang.invoke.MethodHandle 调用私有方法
如何使用方法句柄调用私有方法?
据我所知,只有两种可公开访问的Lookup
实例:
MethodHandles.lookup()
MethodHandles.publicLookup()
并且两者都不允许不受限制的私人访问。
有非公众Lookup.IMPL_LOOKUP
做我想做的事。是否有一些公开的方式来获取它(假设 SecurityManager 允许它)?
java - 如何使用invokedynamic来执行多态的方法?
在所有变量都声明为的 Java 动态语言中java.lang.Object
,我需要调用 Java 内置类。例如,java.math.BigDecimal
构造函数可以接受数字、字符串等。
有没有java.lang.invoke
我可以用来生成合适的MethodHandle
?MethodHandle
应该接受一个作为它的java.lang.Object
参数,但是当被调用时,它应该调用正确的构造函数。
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”可以使用选项。
java - 引导方法如何注册到 Java 中的常量池?
我最近一直在寻找invokedynamic和MethodHandles信息。
似乎 BOTHLinkage.registerBootstrapMethod()
和@BootstrapMethod
都被弃用作为标记引导方法的手段。
它们是如何注册到常量池的?
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。
jvm - 如何在 Jasmin 中使用 invokedynamic?
这里说:
因此,我认为可以使用 jasmin 编写包含调用动力学的指令代码。但是我找不到关于 jasmin 语法的任何文档,我只是想出了如何使用 invokedynamic 来获取 Jasmin 的 VerifyErrors,但不知道如何创建一个工作示例。
这个指令如何在 Jasmin 中正确使用?
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指令实际应用到现实世界的用例中,以便它实际上是对“传统”调用的一些改进(除了惰性常量,我得到了那些......)。
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.