我尝试过两种方法来获取给定函数的MethodHandle。
方法1
Method m = MyClass.class.getMethod("myMethod", String.class, Map.class);
MethodHandle mh = MethodHandles.lookup().unreflect(m);
方法2
MethodType type = MethodType.methodType(void.class, String.class, Map.class);
MethodHandle mh = MethodHandles.lookup().findVirtual(MyClass.class, "myMethod", type);
两者之间有什么区别?
答案 0 :(得分:3)
显然,unreflect
已经已经解析的方法,因此不需要进行查找。此外,它的输出取决于您提供的Method
,static
方法将产生调用static
方法的句柄,而findVirtual
显式请求虚拟方法调用。请注意,MyClass.class.getMethod("myMethod", String.class, Map.class)
也可能会发现static
方法接受String
和Map
。
此外,如果已将setAccessible(true)
应用于Method
实例,您可能会获得一个句柄来访问使用findVirtual
无法访问的其他无法访问的方法。
另一方面,findVirtual
可能会找到签名多态方法MethodHandle.invoke
和MethodHandle.invokeExact
的适当类型调用,这些方法无法通过{{{ 1}}。