diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/lookup/LookupUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/lookup/LookupUtil.java index 9767683b2..bf9372eb4 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/lookup/LookupUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/lookup/LookupUtil.java @@ -163,6 +163,7 @@ public class LookupUtil { MethodHandle handle = null; final MethodHandles.Lookup lookup = LookupUtil.lookup(callerClass); + // 成员方法 try { handle = lookup.findVirtual(callerClass, name, type); } catch (final IllegalAccessException | NoSuchMethodException ignore) { diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodHandleUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodHandleUtil.java index 3b074603e..ff7c674ee 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodHandleUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodHandleUtil.java @@ -18,7 +18,6 @@ import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.reflect.lookup.LookupUtil; import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; /** @@ -42,6 +41,12 @@ public class MethodHandleUtil { /** * 执行方法句柄,{@link MethodHandle#invokeWithArguments(Object...)}包装
+ * 非static方法需先调用{@link MethodHandle#bindTo(Object)}绑定执行对象。 + * + *

+ * 需要注意的是,此处没有使用{@link MethodHandle#invoke(Object...)},因为其参数第一个必须为对象或类。
+ * {@link MethodHandle#invokeWithArguments(Object...)}只需传参数即可。 + *

* * @param methodHandle {@link MethodHandle} * @param args 方法参数值,支持子类转换和自动拆装箱 @@ -72,14 +77,14 @@ public class MethodHandleUtil { * MethodHandleUtil::invoke); * * - * @param 返回结果类型 - * @param obj 接口的子对象或代理对象 - * @param method 方法 - * @param args 参数,自动根据{@link Method}定义类型转换 + * @param 返回结果类型 + * @param obj 接口的子对象或代理对象 + * @param method 方法 + * @param args 参数,自动根据{@link Method}定义类型转换 * @return 结果 * @throws HutoolException 执行异常包装 */ - public static T invoke(final Object obj, final Method method, final Object... args) throws HutoolException{ + public static T invoke(final Object obj, final Method method, final Object... args) throws HutoolException { Assert.notNull(method, "Method must be not null!"); return invokeExact(obj, method, MethodUtil.actualArgs(method, args)); } @@ -99,14 +104,14 @@ public class MethodHandleUtil { * MethodHandleUtil::invoke); * * - * @param 返回结果类型 - * @param obj 接口的子对象或代理对象 - * @param method 方法 - * @param args 参数 + * @param 返回结果类型 + * @param obj 接口的子对象或代理对象 + * @param method 方法 + * @param args 参数 * @return 结果 * @throws HutoolException 执行异常包装 */ - public static T invokeExact(final Object obj, final Method method, final Object... args) throws HutoolException{ + public static T invokeExact(final Object obj, final Method method, final Object... args) throws HutoolException { Assert.notNull(method, "Method must be not null!"); MethodHandle handle; try { @@ -118,24 +123,6 @@ public class MethodHandleUtil { if (null != obj) { handle = handle.bindTo(obj); } - return invokeWithArguments(handle, args); - } - - /** - * 执行方法句柄,{@link MethodHandle#invokeWithArguments(Object...)}包装
- * - * @param handle {@link MethodHandle} - * @param args 方法参数值,支持子类转换和自动拆装箱 - * @param 返回值类型 - * @return 方法返回值 - */ - @SuppressWarnings("unchecked") - public static T invokeWithArguments(final MethodHandle handle, final Object... args){ - Assert.notNull(handle, "MethodHandle must be not null!"); - try { - return (T) handle.invokeWithArguments(args); - } catch (final Throwable e) { - throw ExceptionUtil.wrapRuntime(e); - } + return invokeHandle(handle, args); } }