public class MethodHandleUtil extends Object
MethodHandle封装工具类
MethodHandle类似于C/C++的函数指针,用于模拟在字节码层次的方法调用,且可以采用字节码优化,优于反射。
参考:
| Constructor and Description |
|---|
MethodHandleUtil() |
| Modifier and Type | Method and Description |
|---|---|
static <T> T |
invoke(Object obj,
Method method,
Object... args)
执行接口或对象中的方法
interface Duck {
default String quack() {
return "Quack";
}
}
Duck duck = (Duck) Proxy.newProxyInstance(
ClassLoaderUtil.getClassLoader(),
new Class[] { Duck.class },
MethodHandleUtil::invoke);
|
static <T> T |
invokeExact(Object obj,
Method method,
Object... args)
执行接口或对象中的方法,参数类型不做转换,必须与方法参数类型完全匹配
interface Duck {
default String quack() {
return "Quack";
}
}
Duck duck = (Duck) Proxy.newProxyInstance(
ClassLoaderUtil.getClassLoader(),
new Class[] { Duck.class },
MethodHandleUtil::invoke);
|
static <T> T |
invokeHandle(MethodHandle methodHandle,
Object... args)
执行方法句柄,
MethodHandle.invokeWithArguments(Object...)包装非static方法需先调用 MethodHandle.bindTo(Object)绑定执行对象。 |
public static <T> T invokeHandle(MethodHandle methodHandle, Object... args)
MethodHandle.invokeWithArguments(Object...)包装MethodHandle.bindTo(Object)绑定执行对象。
需要注意的是,此处没有使用MethodHandle.invoke(Object...),因为其参数第一个必须为对象或类。
MethodHandle.invokeWithArguments(Object...)只需传参数即可。
T - 返回值类型methodHandle - MethodHandleargs - 方法参数值,支持子类转换和自动拆装箱public static <T> T invoke(Object obj, Method method, Object... args) throws HutoolException
interface Duck {
default String quack() {
return "Quack";
}
}
Duck duck = (Duck) Proxy.newProxyInstance(
ClassLoaderUtil.getClassLoader(),
new Class[] { Duck.class },
MethodHandleUtil::invoke);
T - 返回结果类型obj - 接口的子对象或代理对象method - 方法args - 参数,自动根据Method定义类型转换HutoolException - 执行异常包装public static <T> T invokeExact(Object obj, Method method, Object... args) throws HutoolException
interface Duck {
default String quack() {
return "Quack";
}
}
Duck duck = (Duck) Proxy.newProxyInstance(
ClassLoaderUtil.getClassLoader(),
new Class[] { Duck.class },
MethodHandleUtil::invoke);
T - 返回结果类型obj - 接口的子对象或代理对象method - 方法args - 参数HutoolException - 执行异常包装Copyright © 2025. All rights reserved.