Class MethodHandle

java.lang.Object
org.aoju.bus.core.lang.reflect.MethodHandle

public class MethodHandle extends Object
方法句柄MethodHandle封装工具类
Since:
Java 17+
Author:
Kimi Liu
  • Constructor Details

    • MethodHandle

      public MethodHandle()
  • Method Details

    • lookup

      public static MethodHandles.Lookup lookup(Class<?> callerClass)
      jdk8中如果直接调用MethodHandles.lookup()获取到的MethodHandles.Lookup在调用findSpecial和unreflectSpecial 时会出现权限不够问题,抛出"no private access for invokespecial"异常,因此针对JDK8及JDK9+分别封装lookup方法。
      Parameters:
      callerClass - 被调用的类或接口
      Returns:
      MethodHandles.Lookup
    • findMethod

      public static MethodHandle findMethod(Class<?> callerClass, String name, MethodType type)
      查找指定方法的方法句柄 此方法只会查找:
      • 当前类的方法(包括构造方法和private方法)
      • 父类的方法(包括构造方法和private方法)
      • 当前类的static方法
      Parameters:
      callerClass - 方法所在类或接口
      name - 方法名称,null或者空则查找构造方法
      type - 返回类型和参数类型
      Returns:
      方法句柄 MethodHandlenull表示未找到方法
    • findConstructor

      public static MethodHandle findConstructor(Class<?> callerClass, Class<?>... args)
      查找指定的构造方法
      Parameters:
      callerClass - 类
      args - 参数
      Returns:
      构造方法句柄
    • findConstructor

      public static MethodHandle findConstructor(Class<?> callerClass, MethodType type)
      查找指定的构造方法
      Parameters:
      callerClass - 类
      type - 参数类型,此处返回类型应为void.class
      Returns:
      构造方法句柄
    • invokeSpecial

      public 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 },
               MethodHandle::invokeDefault);
       
      Type Parameters:
      T - 返回结果类型
      Parameters:
      obj - 接口的子对象或代理对象
      methodName - 方法名称
      args - 参数
      Returns:
      结果
    • invoke

      public static <T> T invoke(Object obj, Method method, Object... args)
      执行接口或对象中的方法
      Type Parameters:
      T - 返回结果类型
      Parameters:
      obj - 接口的子对象或代理对象
      method - 方法
      args - 参数
      Returns:
      结果
    • invokeSpecial

      public 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 },
               MethodHandle::invoke);
       
      Type Parameters:
      T - 返回结果类型
      Parameters:
      obj - 接口的子对象或代理对象
      method - 方法
      args - 参数
      Returns:
      结果
    • invoke

      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 },
               MethodHandle::invoke);
       
      Type Parameters:
      T - 返回结果类型
      Parameters:
      isSpecial - 是否为特殊方法(private、static等)
      obj - 接口的子对象或代理对象
      method - 方法
      args - 参数
      Returns:
      结果