我的问题如下: 我正在尝试使用invoke dynamic,但我遇到了findVirtual和invoke的问题。
Class<?> returnTypeClass = Class.forName("com.etc1.foo.FIXML");
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodType methodType = MethodType.methodType(returnTypeClass ,returnTypeClass); //The method which will be invoked has as a param FIXML object and return a FIXML object
MethodHandle methodHandle = lookup.findVirtual(
com.etc2.foo.GMD,
"name_method",
methodType);
我在findVirtual中遇到了第一个问题,我正在使用下一个MethodType(GMD,FIXML)FIXML - &gt;获得一个methodHandle。这是不正确的,因为我的方法是“public FIXML name_method(FIXML)”,而findVirtual正在创建一个方法手柄“公共FIXML name_method(GMD,FIXML)”,我理解findVirtual使用“com.etc2.foo.GMD”作为参数。 第一个问题来自:如何让findVirtual返回methodHandle FIXML name_method(FIXML)??
第二个问题来自第一个问题,我认为...... 当我通过methodHandle
调用方法时com.etc1.foo.FIXML fixml;
com.etc1.foo.FIXML fixml2;
fixml2 = (FIXML) methodHandle.invoke(fixml);
我收到以下错误“java.lang.invoke.WrongMethodTypeException:无法将MethodHandle(GMD,FIXML)FIXML转换为(Object)对象”
实际上......我一直在研究其他问题,我尝试了不同的解决方案,没有任何效果。
答案 0 :(得分:0)
在打破我的大脑数小时后,我得到了答案。 方法findVirtual正在返回正确的MethodHandle,因为添加的参数( GMD ,FIXML)实际上是将调用该方法的对象,因此我必须通过以下方式调用该方法:
fixml2Obj = (FIXML) methodHandle.invokeWithArguments((Object) Class.forName("com.etc2.foo.GMD").newInstance(), fixmlObj);
我分享几个链接,这些链接给了我关于此的信息:
阅读“方法句柄创建”: http://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandle.html
http://octodecillion.com/blog/java-reflection-on-a-message-using-methodhandle/
答案 1 :(得分:0)
使用"value": {
"rev": "3-7ad1349ec711a99a2a2f1dd1c8b08a20"
}
时,您也可能会遇到同样的问题,因为JVM会创建传递给invokedynamic
方法的参数,并在此方法中进行方法解析。为了避免你发现的错误,你必须从bootrstrap
参数中删除应该调用该方法的类。
MethodType