java的MethodHandle类使用

前言:

MethodHandle类详细的使用方式,下面这两篇文章写得很清楚了:

  java的MethodHandle类详解

  你所不知道的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<Object> arguments = new ArrayList<>();
        arguments.add(bean);
        arguments.addAll(Arrays.asList(args));
        result = methodHandle.invokeWithArguments(arguments);
        return Objects.isNull(result) ? null : (List<?>) result;
    }

  

 

posted @ 2020-11-28 11:52  上课爱睡觉  阅读(594)  评论(0)    收藏  举报