lookup.findvirtual:正在添加classParameter作为方法参数

时间:2015-10-28 11:24:46

标签: java methodhandle

我的问题如下: 我正在尝试使用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)对象”

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

2 个答案:

答案 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