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
- MethodHandle
args
- 方法参数值,支持子类转换和自动拆装箱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.