我的问题如下:
我正在尝试使用动态调用,但是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的methodHandle->这是不正确的,因为我的方法是“ public FIXML name_method(FIXML)”,而findVirtual正在创建methodHandle“ public FIXML name_method(GMD,FIXML)”,我知道findVirtual使用“ com.etc2.foo.GMD”作为参数。
来自这里的第一个问题:如何获取findVirtual返回方法Handle 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)Object”

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

最佳答案

经过数小时的努力,我得到了答案。
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/

10-08 18:13