我的问题如下:
我正在尝试使用动态调用,但是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/