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.Lookup
public 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 © 2024. All rights reserved.