问题标签 [methodhandle]

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 回答
502 浏览

java - Java 代码要编译成常量池中的 MethodHandle


我正在尝试使用完整源代码(未检测)的 Java 8 Nashorn 。您可能知道,它使用Nasgen来修改 .classes,输出以 .classes 格式提供JRE/lib/ext/nashorn.jar


在反汇编输出时,使用javap

这可能被错误地写为

,它应该调用带有签名的超级构造函数:



我的问题是第二个参数NativeFunction.function,我没有可编译的源,MethodHandle在常量池中生成相同的,

这部分检测由ASM通过调用MethodVisitor.visitLdcInsn 完成

那么,有没有办法从 Java 源代码构造这样的方法句柄,或者这是一个只能在字节码级别完成的功能?

完整的 javap 输出:

0 投票
2 回答
145 浏览

java - 如何方便地包装调用者敏感的 API?

某些 Java API 对调用者敏感。一个(可悲的未充分记录的 IMO)示例是System.load(),它仅将一些 JNI 代码加载到调用者的代码中ClassLoader

我有一个看起来大致像JniUtils.loadLibrary("nameoflibrary"). 它为当前架构找到合适的库,将其从 JAR 中提取出来,并将其传递给System.load(). 但是我刚刚遇到了一个调用者JniUtils.loadLibraryClassLoader自身不同的情况Jni。这导致库被加载到错误的ClassLoader中,导致UnsatisfiedLinkError一旦调用本机方法。

在不依赖 JVM 内部结构sun.reflect.Reflection.getCallerClass()的情况下,有没有办法解决这个问题?我目前的想法是像这样更改包装器:

可以这样调用:

使用Lookup来解析和调用System.load()方法应该保留NeedsJni为调用者

有更好的解决方法吗?

0 投票
2 回答
107 浏览

java - lookup.findvirtual:classParameter 被添加为方法参数

我的问题如下:我正在尝试使用动态调用,但我在使用 findVirtual 和调用时遇到问题。

我在 findVirtual 中遇到了第一个问题,我得到了一个带有下一个 MethodType (GMD,FIXML)FIXML 的 methodHandle --> 这是不正确的,因为我的方法是“public FIXML name_method(FIXML)”并且 findVirtual 正在创建一个 methodHandle “ public FIXML name_method(GMD,FIXML)",我知道 findVirtual 使用 "com.etc2.foo.GMD" 作为参数。来自这里的第一个问题:如何让 findVirtual 返回 methodHandle FIXML name_method(FIXML)?

第二个问题来自第一个问题,我认为......当我通过methodHandle调用方法时

我收到以下错误“java.lang.invoke.WrongMethodTypeException:无法将 MethodHandle(GMD,FIXML)FIXML 转换为 (Object)Object”

实际上......我一直在研究其他问题,我尝试了不同的解决方案,但没有任何效果。

0 投票
2 回答
201 浏览

java - 框架/库可以使用 MethodHandle(而不是传统的反射)吗?

在我的框架中,我有一个这样的类:

此类用于调用由用户创建的类的 getter,这些类在我的框架编译时不可用。例如,B可能是一个名为Person.

通过分析,我发现这种方法非常慢。Method.invoke()采样分析(即使使用 )占用了 40% 的性能,而非setAccessible(true)反射实现只占用了该性能的一小部分。

所以我想用 a 替换 is MethodHandle

但后来我得到了这个例外:

即使beanPerson. 现在误导的部分是它试图将一个Object[](而不是一个Object)投射到Person. 请注意,将其包装在对象数组中(这是一种性能损失)并没有帮助:

是否有可能MethodHandle在这种情况下工作?

0 投票
2 回答
2373 浏览

java - MethodHandle 到另一个类的 getter/setter 给出 NoSuchFieldError

假设我有MyPerson一个带有namegetter 和 setter 的简单 javabean:

现在我正在运行这个简单地获取和设置该name字段的主代码:

如果我main()在 class 上添加该方法MyPerson,我会得到我所期望的:

如果我在另一个包中的另一个类上添加相同main()的方法,我会收到这个奇怪的错误:

为什么?MyPerson的 getter/setter 是公开的,因此没有理由MyMain不使用它们,即使通过 MethodHandles。

将 JDK 8 与源/目标级别 java 8 一起使用。

0 投票
1 回答
1842 浏览

java - Methodhandle 使用 findVirtual 调用的私有方法

MethodHandle 的 Java 文档说私有方法应该通过 findSpecial 调用。但是在下面的示例中,我可以通过 findVirtual 调用它。

有人可以解释一下我在这里缺少什么吗?

0 投票
0 回答
349 浏览

java - Java 8 更新 51 (sun-jdk-8u51) 在使用 448 System::gc Runnable arguments 的 null MethodHandle invokeExact 调用后出现运行时致命错误

概括

我能够用一个调用空 MethodHandle 的 invokeExact 方法的 main 方法编译一个接口,该方法有 448 个 Runnable 方法引用 (System::gc) 实例。

当我运行界面时,Java 运行时环境检测到一个致命错误:

  • SIGSEGV (0xb) 在 pc=0xb71b9bde,pid=12918,tid=3030936432
  • JRE 版本:Java(TM) SE 运行时环境 (8.0_51-b16) (build 1.8.0_51-b16)
  • Java VM:Java HotSpot(TM) 客户端 VM(25.51-b03 混合模式 linux-x86 )
  • 有问题的框架:
    • V [libjvm.so+0x507bde] SignatureIterator::parse_type()+0x1ce

源码和运行结果链接:http: //ideone.com/3oh7Uk

资源

结果

0 投票
2 回答
1611 浏览

java - 如何使用 MethodHandles.Lookup 查找数组构造函数 MethodHandle?

我如何获得MethodHandle像这样的数组构造函数int[]::new

这不起作用:

结果是:

这也不是:

它似乎找到了构造函数Object

0 投票
1 回答
161 浏览

java - 为什么 (int)MethodHandle.invokeExact 没有 checkcast 指令?

我为 try Java MethodHandle-API 创建了 2 个简单的类:

Foo.getStaticField()另一个以两种方式调用方法的类- 直接和使用MethodHandle-API:

我已经反编译了类,并看到该directGetStaticField方法包含强制转换指令,但方法methodHandleGetStaticField没有,尽管java.lang.invoke.MethodHandle.invokeExact()返回java.lang.Object

谁能为我解释一下?

0 投票
1 回答
251 浏览

java - Java 方法句柄:跨函数传播未绑定的参数

我想创建一个方法句柄,允许我将一个值作为参数传递,该值将绑定到方法句柄树下的占位符。

如图,类似这样:f(x) = plus( minus( x, 2), 3)其中 x 在调用时传递,2 和 3 是一些常量 MethodHandles,它们总是返回 2 或 3。

我遇到了一个我不明白的问题:

这在尝试过滤 plus_3 时返回异常:

我不明白的是,我如何用减号组合加号,其中减号有一个尚未完成的论点。

你能帮助我吗?