public class MethodHandleUtil extends Object
MethodHandle封装工具类| Constructor and Description |
|---|
MethodHandleUtil() |
| Modifier and Type | Method and Description |
|---|---|
static MethodHandle |
findConstructor(Class<?> callerClass,
Class<?>... args)
查找指定的构造方法
|
static MethodHandle |
findConstructor(Class<?> callerClass,
MethodType type)
查找指定的构造方法
|
static MethodHandle |
findMethod(Class<?> callerClass,
String name,
MethodType type)
查找指定方法的方法句柄
此方法只会查找: 当前类的方法(包括构造方法和private方法) 父类的方法(包括构造方法和private方法) 当前类的static方法 |
static <T> T |
invoke(boolean isSpecial,
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 |
invoke(Object obj,
Method method,
Object... args)
执行接口或对象中的方法
|
static <T> T |
invokeSpecial(Object obj,
Method method,
Object... args)
执行接口或对象中的特殊方法(private、static等)
interface Duck {
default String quack() {
return "Quack";
}
}
Duck duck = (Duck) Proxy.newProxyInstance(
ClassLoaderUtil.getClassLoader(),
new Class[] { Duck.class },
MethodHandleUtil::invoke);
|
static <T> T |
invokeSpecial(Object obj,
String methodName,
Object... args)
执行接口或对象中的特殊方法(private、static等)
interface Duck {
default String quack() {
return "Quack";
}
}
Duck duck = (Duck) Proxy.newProxyInstance(
ClassLoaderUtil.getClassLoader(),
new Class[] { Duck.class },
MethodHandleUtil::invokeDefault);
|
static MethodHandles.Lookup |
lookup(Class<?> callerClass)
jdk8中如果直接调用
MethodHandles.lookup()获取到的MethodHandles.Lookup在调用findSpecial和unreflectSpecial
时会出现权限不够问题,抛出"no private access for invokespecial"异常,因此针对JDK8及JDK9+分别封装lookup方法。 |
public static MethodHandles.Lookup lookup(Class<?> callerClass)
MethodHandles.lookup()获取到的MethodHandles.Lookup在调用findSpecial和unreflectSpecial
时会出现权限不够问题,抛出"no private access for invokespecial"异常,因此针对JDK8及JDK9+分别封装lookup方法。callerClass - 被调用的类或接口MethodHandles.Lookuppublic static MethodHandle findMethod(Class<?> callerClass, String name, MethodType type)
callerClass - 方法所在类或接口name - 方法名称,null或者空则查找构造方法type - 返回类型和参数类型MethodHandle,null表示未找到方法public static MethodHandle findConstructor(Class<?> callerClass, Class<?>... args)
callerClass - 类args - 参数public static MethodHandle findConstructor(Class<?> callerClass, MethodType type)
callerClass - 类type - 参数类型,此处返回类型应为void.classpublic static <T> T invokeSpecial(Object obj, String methodName, Object... args)
interface Duck {
default String quack() {
return "Quack";
}
}
Duck duck = (Duck) Proxy.newProxyInstance(
ClassLoaderUtil.getClassLoader(),
new Class[] { Duck.class },
MethodHandleUtil::invokeDefault);
T - 返回结果类型obj - 接口的子对象或代理对象methodName - 方法名称args - 参数public static <T> T invoke(Object obj, Method method, Object... args)
T - 返回结果类型obj - 接口的子对象或代理对象method - 方法args - 参数public static <T> T invokeSpecial(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);
T - 返回结果类型obj - 接口的子对象或代理对象method - 方法args - 参数public static <T> T invoke(boolean isSpecial,
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);
T - 返回结果类型isSpecial - 是否为特殊方法(private、static等)obj - 接口的子对象或代理对象method - 方法args - 参数Copyright © 2025. All rights reserved.