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);
}
}