Package org.aoju.bus.core.lang.reflect
Class MethodHandle
java.lang.Object
org.aoju.bus.core.lang.reflect.MethodHandle
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic MethodHandlefindConstructor(Class<?> callerClass, Class<?>... args) 查找指定的构造方法static MethodHandlefindConstructor(Class<?> callerClass, MethodType type) 查找指定的构造方法static MethodHandlefindMethod(Class<?> callerClass, String name, MethodType type) 查找指定方法的方法句柄 此方法只会查找: 当前类的方法(包括构造方法和private方法) 父类的方法(包括构造方法和private方法) 当前类的static方法static <T> T执行接口或对象中的方法static <T> T执行接口或对象中的方法static <T> TinvokeSpecial(Object object, Method method, Object... args) 执行接口或对象中的特殊方法(private、static等)static <T> TinvokeSpecial(Object object, String methodName, Object... args) 执行接口或对象中的特殊方法(private、static等)static MethodHandles.Lookupjdk8中如果直接调用MethodHandles.lookup()获取到的MethodHandles.Lookup在调用findSpecial和unreflectSpecial 时会出现权限不够问题,抛出"no private access for invokespecial"异常,因此针对JDK8及JDK9+分别封装lookup方法。
-
Constructor Details
-
MethodHandle
public MethodHandle()
-
-
Method Details
-
lookup
jdk8中如果直接调用MethodHandles.lookup()获取到的MethodHandles.Lookup在调用findSpecial和unreflectSpecial 时会出现权限不够问题,抛出"no private access for invokespecial"异常,因此针对JDK8及JDK9+分别封装lookup方法。- Parameters:
callerClass- 被调用的类或接口- Returns:
MethodHandles.Lookup
-
findMethod
查找指定方法的方法句柄 此方法只会查找:- 当前类的方法(包括构造方法和private方法)
- 父类的方法(包括构造方法和private方法)
- 当前类的static方法
- Parameters:
callerClass- 方法所在类或接口name- 方法名称,null或者空则查找构造方法type- 返回类型和参数类型- Returns:
- 方法句柄
MethodHandle,null表示未找到方法
-
findConstructor
查找指定的构造方法- Parameters:
callerClass- 类args- 参数- Returns:
- 构造方法句柄
-
findConstructor
查找指定的构造方法- Parameters:
callerClass- 类type- 参数类型,此处返回类型应为void.class- Returns:
- 构造方法句柄
-
invokeSpecial
执行接口或对象中的特殊方法(private、static等)interface Duck { default String quack() { return "Quack"; } } Duck duck = (Duck) Proxy.newProxyInstance(ClassKit.getClassLoader(), new Class[] { Duck.class }, MethodHandle::invokeDefault);- Type Parameters:
T- 返回结果类型- Parameters:
object- 接口的子对象或代理对象methodName- 方法名称args- 参数- Returns:
- 结果
-
invoke
-
invokeSpecial
执行接口或对象中的特殊方法(private、static等)interface Duck { default String quack() { return "Quack"; } } Duck duck = (Duck) Proxy.newProxyInstance(ClassKit.getClassLoader(), new Class[] { Duck.class }, MethodHandle::invoke);- Type Parameters:
T- 返回结果类型- Parameters:
object- 接口的子对象或代理对象method- 方法args- 参数- Returns:
- 结果
-
invoke
执行接口或对象中的方法interface Duck { default String quack() { return "Quack"; } } Duck duck = (Duck) Proxy.newProxyInstance(ClassKit.getClassLoader(), new Class[] { Duck.class }, MethodHandle::invoke);- Type Parameters:
T- 返回结果类型- Parameters:
isSpecial- 是否为特殊方法(private、static等)object- 接口的子对象或代理对象method- 方法args- 参数- Returns:
- 结果
-