问题标签 [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.
java - Java 代码要编译成常量池中的 MethodHandle
我正在尝试使用完整源代码(未检测)的 Java 8 Nashorn 。您可能知道,它使用Nasgen来修改 .classes,输出以 .classes 格式提供JRE/lib/ext/nashorn.jar
。
在反汇编输出时,使用javap
:
这可能被错误地写为
,它应该调用带有签名的超级构造函数:
我的问题是第二个参数NativeFunction.function
,我没有可编译的源,MethodHandle
在常量池中生成相同的,
这部分检测由ASM通过调用MethodVisitor.visitLdcInsn 完成。
那么,有没有办法从 Java 源代码构造这样的方法句柄,或者这是一个只能在字节码级别完成的功能?
完整的 javap 输出:
java - 如何方便地包装调用者敏感的 API?
某些 Java API 对调用者敏感。一个(可悲的未充分记录的 IMO)示例是System.load()
,它仅将一些 JNI 代码加载到调用者的代码中ClassLoader
。
我有一个看起来大致像JniUtils.loadLibrary("nameoflibrary")
. 它为当前架构找到合适的库,将其从 JAR 中提取出来,并将其传递给System.load()
. 但是我刚刚遇到了一个调用者JniUtils.loadLibrary
与ClassLoader
自身不同的情况Jni
。这导致库被加载到错误的ClassLoader
中,导致UnsatisfiedLinkError
一旦调用本机方法。
在不依赖 JVM 内部结构sun.reflect.Reflection.getCallerClass()
的情况下,有没有办法解决这个问题?我目前的想法是像这样更改包装器:
可以这样调用:
使用Lookup
来解析和调用System.load()
方法应该保留NeedsJni
为调用者。
有更好的解决方法吗?
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”
实际上......我一直在研究其他问题,我尝试了不同的解决方案,但没有任何效果。
java - 框架/库可以使用 MethodHandle(而不是传统的反射)吗?
在我的框架中,我有一个这样的类:
此类用于调用由用户创建的类的 getter,这些类在我的框架编译时不可用。例如,B
可能是一个名为Person
.
通过分析,我发现这种方法非常慢。Method.invoke()
采样分析(即使使用 )占用了 40% 的性能,而非setAccessible(true)
反射实现只占用了该性能的一小部分。
所以我想用 a 替换 is MethodHandle
:
但后来我得到了这个例外:
即使bean
是Person
. 现在误导的部分是它试图将一个Object[]
(而不是一个Object
)投射到Person
. 请注意,将其包装在对象数组中(这是一种性能损失)并没有帮助:
是否有可能MethodHandle
在这种情况下工作?
java - MethodHandle 到另一个类的 getter/setter 给出 NoSuchFieldError
假设我有MyPerson
一个带有name
getter 和 setter 的简单 javabean:
现在我正在运行这个简单地获取和设置该name
字段的主代码:
如果我main()
在 class 上添加该方法MyPerson
,我会得到我所期望的:
如果我在另一个包中的另一个类上添加相同main()
的方法,我会收到这个奇怪的错误:
为什么?MyPerson
的 getter/setter 是公开的,因此没有理由MyMain
不使用它们,即使通过 MethodHandles。
将 JDK 8 与源/目标级别 java 8 一起使用。
java - Methodhandle 使用 findVirtual 调用的私有方法
MethodHandle 的 Java 文档说私有方法应该通过 findSpecial 调用。但是在下面的示例中,我可以通过 findVirtual 调用它。
有人可以解释一下我在这里缺少什么吗?
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
资源
结果
java - 如何使用 MethodHandles.Lookup 查找数组构造函数 MethodHandle?
我如何获得MethodHandle
像这样的数组构造函数int[]::new
?
这不起作用:
结果是:
这也不是:
它似乎找到了构造函数Object
:
java - 为什么 (int)MethodHandle.invokeExact 没有 checkcast 指令?
我为 try Java MethodHandle
-API 创建了 2 个简单的类:
Foo.getStaticField()
另一个以两种方式调用方法的类- 直接和使用MethodHandle
-API:
我已经反编译了类,并看到该directGetStaticField
方法包含强制转换指令,但方法methodHandleGetStaticField
没有,尽管java.lang.invoke.MethodHandle.invokeExact()
返回java.lang.Object
。
谁能为我解释一下?
java - Java 方法句柄:跨函数传播未绑定的参数
我想创建一个方法句柄,允许我将一个值作为参数传递,该值将绑定到方法句柄树下的占位符。
如图,类似这样:f(x) = plus( minus( x, 2), 3)
其中 x 在调用时传递,2 和 3 是一些常量 MethodHandles,它们总是返回 2 或 3。
我遇到了一个我不明白的问题:
这在尝试过滤 plus_3 时返回异常:
我不明白的是,我如何用减号组合加号,其中减号有一个尚未完成的论点。
你能帮助我吗?