问题标签 [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 投票
2 回答
501 浏览

java - 如何使用 LambdaMetaFactory 实例化对象?

我有一个界面动作:

类 SimpleAction:

类复杂动作:

我想创建一个函数,它采用类的名称并返回该类的对象。这就是我迄今为止在我的职能中所拥有的 -

0 投票
0 回答
139 浏览

lambda - JavaAssist 在 ASM 中是否有类似 visitInvokeDynamicInsn 的东西

我想使用 JavaAssist 在我的所有项目文件中添加一些代码。我将使用每种方法的参数。但是我发现在使用 lambda 时,它在类中生成了一个新方法,并且最终会更改原始方法的参数。那么JavaAssist在ASM的MethodVisitor中是否有类似visitInvokeDynamicInsn方法的东西,我可以得到方法的原始所有者、参数和名称?谢谢。

0 投票
1 回答
1025 浏览

java - 使用 java MethodHandles 实现鸭子类型

我有两个类A,并且B都定义foo()了具有共同签名的方法(不接受任何内容,返回无效)。它们没有声明此方法的通用基类(或接口)。我想在 As 或 B 上调用这个方法,只要他们能响应这个调用。这种方法称为Duck Typing

我知道有一条指令叫做invokedynamic

invokedynamic 指令的每个实例称为动态调用站点。动态调用站点最初处于未链接状态,这意味着没有指定调用站点调用的方法。如前所述,动态调用站点通过引导方法链接到方法。动态调用站点的引导方法是编译器为动态类型语言指定的方法,JVM 调用一次以链接站点。从引导方法返回的对象永久确定调用站点的行为。

所以我尝试使用MethodHandles来实现这一点。这是示例:

当然,我有:

invokedynamic我清楚地看到和之间的区别MethodHanle。我看到问题在于fooMethodHandle 绑定到class A,而不是class B. invokedynamic但我有可能在这种特殊情况下以某种方式利用吗?

为什么我需要这个?这是我的小型研究项目的一部分。我正在尝试深入了解方法句柄,并且我想在从字段和方法中检索到的注释实例上调用常用方法。我无法在 Java 中为注释定义基类,因此不是使用实例化链和类强制转换或使用违反访问权限的反射检索这些值,如果可能的话,我想实现这种鸭子类型。

谢谢。

0 投票
0 回答
106 浏览

java - 使用 ASM 检测 java lambda

我正在添加对在 concolic 引擎中检测 invokedynamic 的支持,我们目前检测的方式是使用自定义类加载器,该类加载器在类路径中查找与该类相关的资源,但由于 lambda 是动态创建的合成类,它不是实际上在那里。

您知道如何检测调用动态生成的类吗?我已经看到使用代理可能是一种选择,但我想确保我不能重用我已经拥有的东西。

0 投票
2 回答
1121 浏览

java - `StringConcatFactory`中的`makeConcat​`和`makeConcatWithConstants`方法如何直接调用API使用?

0 投票
0 回答
63 浏览

scala - 如何使用 JDI 检测 invokedynamic 和 scalac 2.12 输出代码

我想使用 JDI 对使用/用于 scala 2.12 编译的 ScalaCheck 进行检测。

通过运行,javap我得出结论,scalac 2.12.x 发出调用动态指令(对于 x 的某些值),其中 scala 2.11 用于生成内部类,尤其是嵌套方法/函数。

这提出了一个挑战,因为出于性能原因,我想在某些特定的嵌套函数(特别是result(x: T)in Prop.forAllShrink)上设置和取消设置断点。

是否可以invokedynamic使用 JDI 检测代码?如果是这样,怎么做?

我是新手invokedynamic,不清楚该机制是如何工作的。我的理解是,您的代码(在我的示例中由 scalac 发出的代码)在每次invokedynamic调用时都会做出链接决策,除了出于性能原因,此决策是根据用户可指定的标准进行缓存的。但是,不执行运行时代码生成。这表明原则上invokedynamic代码应该是可检测的。

我还在一些 scalac 输出中看到了一个可怕的名字:deserializeLambda. 我不太确定这意味着什么,但我认为这并不意味着我会过得很轻松。

0 投票
1 回答
65 浏览

android - android验证器源代码在哪里?

我在哪里可以找到android代码验证器的源代码?我想使用s 但从android 验证程序中invokedynamic获取一些 VerifyErrors ( )。java.lang.VerifyError: Verifier rejected class ...我的代码使用普通的 JVM 可以完美运行,没有验证问题,但是 android 验证器拒绝它,我想分析它为什么会这样。我似乎无法在线找到验证程序源代码,但如果它在我的设备上运行,它必须在某个地方。

0 投票
3 回答
175 浏览

jvm - 如何使用`MethodHandle`模仿`tableswitch`?

上下文:我一直在对使用invokedynamic和手动生成字节码之间的区别进行基准测试(这是在决定针对 JVM 的编译器是应该发出更详细的“传统”字节码还是仅仅invokedynamic使用聪明的引导方法进行调用的上下文中)。MethodHandles在这样做时,将字节码映射到至少同样快的组合器非常简单,除了tableswitch.

问题:有模仿tableswitch使用的技巧MethodHandle吗?我试着用一个跳转表来模仿它:使用一个常量MethodHandle[],用 索引到它arrayElementGetter,然后用 调用找到的句柄MethodHandles.invoker。然而,当我通过 JMH 运行它时,它最终比原始字节码慢了大约 50%。

下面是生成方法句柄的代码:

这是初始字节码(我试图用一个invokedynamic电话替换)

0 投票
1 回答
113 浏览

java - 从 invokedynamic 调用 Java varargs 方法

我想从 Java 动态调用本机方法。因为方法签名在编译时是未知的,所以我为大多数具有相同签名的原始返回类型创建了通用本机方法:

我希望创建一个 MethodHandle,然后调用匹配的callXXX方法并传入装箱的方法,funcArgs就好像它们是单独提供的一样。callXXX可以像这样访问这些方法:

我正在使用这个引导方法callXXX在invokedynamic中间接引用这个方法,它的工作方式与上面相同:

然后调用通过 invokedynamic 完成,如下所示:

但是,这不能按预期工作并引发异常:

如何构造一个正确的 MethodHandle,它像常规方法一样接受参数,然后调用 varargcallXXX方法?

0 投票
0 回答
72 浏览

scala - 从 `=> T` 到​​ `() => T` 再返回

作为 types=> T() => Tare both的参数Function0,我总是天真地假设从一个到另一个的转换是无用的。然而,看起来,虽然对于 是正确的(=>T) => (() => T),但另一个方向(() => T) => (=> T)导致将函数的执行包装在invokedynamiclambda 中 - 至少就我可以读取字节码而言。

  1. 为什么?
  2. 我怎样才能让它停止?