问题标签 [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 - 如何使用 LambdaMetaFactory 实例化对象?
我有一个界面动作:
类 SimpleAction:
类复杂动作:
我想创建一个函数,它采用类的名称并返回该类的对象。这就是我迄今为止在我的职能中所拥有的 -
lambda - JavaAssist 在 ASM 中是否有类似 visitInvokeDynamicInsn 的东西
我想使用 JavaAssist 在我的所有项目文件中添加一些代码。我将使用每种方法的参数。但是我发现在使用 lambda 时,它在类中生成了一个新方法,并且最终会更改原始方法的参数。那么JavaAssist在ASM的MethodVisitor中是否有类似visitInvokeDynamicInsn方法的东西,我可以得到方法的原始所有者、参数和名称?谢谢。
java - 使用 java MethodHandles 实现鸭子类型
我有两个类A
,并且B
都定义foo()
了具有共同签名的方法(不接受任何内容,返回无效)。它们没有声明此方法的通用基类(或接口)。我想在 As 或 B 上调用这个方法,只要他们能响应这个调用。这种方法称为Duck Typing。
我知道有一条指令叫做invokedynamic:
invokedynamic 指令的每个实例称为动态调用站点。动态调用站点最初处于未链接状态,这意味着没有指定调用站点调用的方法。如前所述,动态调用站点通过引导方法链接到方法。动态调用站点的引导方法是编译器为动态类型语言指定的方法,JVM 调用一次以链接站点。从引导方法返回的对象永久确定调用站点的行为。
所以我尝试使用MethodHandles来实现这一点。这是示例:
当然,我有:
invokedynamic
我清楚地看到和之间的区别MethodHanle
。我看到问题在于foo
MethodHandle 绑定到class A
,而不是class B
. invokedynamic
但我有可能在这种特殊情况下以某种方式利用吗?
为什么我需要这个?这是我的小型研究项目的一部分。我正在尝试深入了解方法句柄,并且我想在从字段和方法中检索到的注释实例上调用常用方法。我无法在 Java 中为注释定义基类,因此不是使用实例化链和类强制转换或使用违反访问权限的反射检索这些值,如果可能的话,我想实现这种鸭子类型。
谢谢。
java - 使用 ASM 检测 java lambda
我正在添加对在 concolic 引擎中检测 invokedynamic 的支持,我们目前检测的方式是使用自定义类加载器,该类加载器在类路径中查找与该类相关的资源,但由于 lambda 是动态创建的合成类,它不是实际上在那里。
您知道如何检测调用动态生成的类吗?我已经看到使用代理可能是一种选择,但我想确保我不能重用我已经拥有的东西。
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
. 我不太确定这意味着什么,但我认为这并不意味着我会过得很轻松。
android - android验证器源代码在哪里?
我在哪里可以找到android代码验证器的源代码?我想使用s 但从android 验证程序中invokedynamic
获取一些 VerifyErrors ( )。java.lang.VerifyError: Verifier rejected class ...
我的代码使用普通的 JVM 可以完美运行,没有验证问题,但是 android 验证器拒绝它,我想分析它为什么会这样。我似乎无法在线找到验证程序源代码,但如果它在我的设备上运行,它必须在某个地方。
jvm - 如何使用`MethodHandle`模仿`tableswitch`?
上下文:我一直在对使用invokedynamic
和手动生成字节码之间的区别进行基准测试(这是在决定针对 JVM 的编译器是应该发出更详细的“传统”字节码还是仅仅invokedynamic
使用聪明的引导方法进行调用的上下文中)。MethodHandles
在这样做时,将字节码映射到至少同样快的组合器非常简单,除了tableswitch
.
问题:有模仿tableswitch
使用的技巧MethodHandle
吗?我试着用一个跳转表来模仿它:使用一个常量MethodHandle[]
,用 索引到它arrayElementGetter
,然后用 调用找到的句柄MethodHandles.invoker
。然而,当我通过 JMH 运行它时,它最终比原始字节码慢了大约 50%。
下面是生成方法句柄的代码:
这是初始字节码(我试图用一个invokedynamic
电话替换)
java - 从 invokedynamic 调用 Java varargs 方法
我想从 Java 动态调用本机方法。因为方法签名在编译时是未知的,所以我为大多数具有相同签名的原始返回类型创建了通用本机方法:
我希望创建一个 MethodHandle,然后调用匹配的callXXX
方法并传入装箱的方法,funcArgs
就好像它们是单独提供的一样。callXXX
可以像这样访问这些方法:
我正在使用这个引导方法callXXX
在invokedynamic中间接引用这个方法,它的工作方式与上面相同:
然后调用通过 invokedynamic 完成,如下所示:
但是,这不能按预期工作并引发异常:
如何构造一个正确的 MethodHandle,它像常规方法一样接受参数,然后调用 varargcallXXX
方法?
scala - 从 `=> T` 到 `() => T` 再返回
作为 types=> T
和() => T
are both的参数Function0
,我总是天真地假设从一个到另一个的转换是无用的。然而,看起来,虽然对于 是正确的(=>T) => (() => T)
,但另一个方向(() => T) => (=> T)
导致将函数的执行包装在invokedynamic
lambda 中 - 至少就我可以读取字节码而言。
- 为什么?
- 我怎样才能让它停止?