前言:
MethodHandle类详细的使用方式,下面这两篇文章写得很清楚了:
这里再补充一点我遇到的问题:
问题1:
MethodType.methodType() 的第一个参数是返回值的class,后面才是参数的class,这一点需要注意。
问题2:
MethodHandle#invoke(Object... args)
MethodHandle#invokeExact(Object... args)
这两个方法不能直接将数组作为参数传入,因为数组也是一个 Object 对象,所以会抛出异常。
正确的调用方式是使用下面两个方法,用来进行参数不确定的动态调用
MethodHandle#invokeWithArguments(Object... arguments)
MethodHandle#invokeWithArguments(java.util.List> arguments)
private List> invokeFindPrimaryKeyMethod(Object bean, String methodName, Class>[] argsTypeList, Object[] args) throws Throwable {
MethodType mt = getMethodType(argsTypeList, args);
MethodHandle methodHandle = MethodHandles.lookup().findVirtual(bean.getClass(), methodName, mt);
Object result;
// 组装 arguments
List arguments = new ArrayList<>();
arguments.add(bean);
arguments.addAll(Arrays.asList(args));
result = methodHandle.invokeWithArguments(arguments);
return Objects.isNull(result) ? null : (List>) result;
}