Class ReflectKit

java.lang.Object
org.miaixz.bus.core.xyz.ReflectKit

public class ReflectKit extends Object
反射相关工具类

本工具类进行了重构,大部分被移动到了FieldKitMethodKitModifierKit等中, 其他相关方法请参考org.miaixz.bus.core.lang.reflect包下的类,相关类

在字节码中,类型表示如下:
  • byte = B
  • char = C
  • double = D
  • long = J
  • short = S
  • boolean = Z
  • void = V
  • 对象类型以“L”开头,“;”结尾,如Ljava/lang/Object;
  • 数组类型,每一位使用一个前置的[字符来描述,如:java.lang.String[][] = [[Ljava/lang/String;

此类旨在通过类描述信息和类名查找对应的类,如动态加载类等

Since:
Java 17+
Author:
Kimi Liu
  • Field Details

  • Constructor Details

    • ReflectKit

      public ReflectKit()
  • Method Details

    • descToClass

      public static Class<?> descToClass(String desc) throws InternalException
      Class描述转Class
      
       "[Z" => boolean[].class
       "[[Ljava/util/Map;" => java.util.Map[][].class
       
      Parameters:
      desc - 类描述
      Returns:
      Class
      Throws:
      InternalException - 类没有找到
    • descToClass

      public static Class<?> descToClass(String desc, boolean isInitialized, ClassLoader cl) throws InternalException
      Class描述转Class
      
       "[Z" => boolean[].class
       "[[Ljava/util/Map;" => java.util.Map[][].class
       
      Parameters:
      desc - 类描述
      isInitialized - 是否初始化类
      cl - ClassLoader
      Returns:
      Class
      Throws:
      InternalException - 类没有找到
    • getDesc

      public static String getDesc(Class<?> c)
      获取类描述,这是编译成class文件后的二进制名称
      
          getDesc(boolean.class)       // Z
          getDesc(Boolean.class)       // Ljava/lang/Boolean;
          getDesc(double[][][].class)  // [[[D
          getDesc(int.class)           // I
          getDesc(Integer.class)       // Ljava/lang/Integer;
       
      Parameters:
      c - class.
      Returns:
      desc.
    • getDesc

      public static String getDesc(Executable methodOrConstructor, boolean appendName)
      获取方法或构造描述 方法(appendName为true):
      
          int do(int arg1) => "do(I)I"
          void do(String arg1,boolean arg2) => "do(Ljava/lang/String;Z)V"
       
      构造:
      
          "()V", "(Ljava/lang/String;I)V"
       

      当appendName为false时:

      
          getDesc(Object.class.getMethod("hashCode"))                    // ()I
          getDesc(Object.class.getMethod("toString"))                    // ()Ljava/lang/String;
          getDesc(Object.class.getMethod("equals", Object.class))        // (Ljava/lang/Object;)Z
          getDesc(ArrayKit.class.getMethod("isEmpty", Object[].class))  // "([Ljava/lang/Object;)Z"
       
      Parameters:
      methodOrConstructor - 方法或构造
      appendName - 是否包含方法名称
      Returns:
      描述
    • getName

      public static String getName(Class<?> c)
      获得类名称 数组输出xxx[]形式,其它类调用Class.getName()
      
       java.lang.Object[][].class => "java.lang.Object[][]"
       
      Parameters:
      c - 类
      Returns:
      类名称
    • getName

      public static String getName(Executable executable)
      获取构造或方法的名称表示 构造:
       "()", "(java.lang.String,int)"
       

      方法:

           "void do(int)", "void do()", "int do(java.lang.String,boolean)"
       
      Parameters:
      executable - 方法或构造
      Returns:
      名称
    • nameToClass

      public static Class<?> nameToClass(String name, boolean isInitialized, ClassLoader cl)
      类名称转类
      
       "boolean" => boolean.class
       "java.util.Map[][]" => java.util.Map[][].class
       
      Parameters:
      name - name.
      isInitialized - 是否初始化类
      cl - ClassLoader instance.
      Returns:
      Class instance.
    • nameToDesc

      public static String nameToDesc(String name)
      类名称转描述
      
       java.util.Map[][] => "[[Ljava/util/Map;"
       
      Parameters:
      name - 名称
      Returns:
      描述
    • descToName

      public static String descToName(String desc)
      类描述转名称
      
       "[[I" => "int[][]"
       
      Parameters:
      desc - 描述
      Returns:
      名称
    • getCodeBase

      public static String getCodeBase(Class<?> clazz)
      获取code base
      Parameters:
      clazz - 类
      Returns:
      code base
    • setAccessibleQuietly

      public static <T extends AccessibleObject> T setAccessibleQuietly(T accessibleObject)
      设置方法为可访问(私有方法可以被外部调用),静默调用,抛出异常则跳过 注意此方法在jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数
      Type Parameters:
      T - AccessibleObject的子类,比如Class、Method、Field等
      Parameters:
      accessibleObject - 可设置访问权限的对象,比如Class、Method、Field等
      Returns:
      被设置可访问的对象
      Throws:
      SecurityException - 访问被禁止抛出此异常
    • setAccessible

      public static <T extends AccessibleObject> T setAccessible(T accessibleObject) throws SecurityException
      设置方法为可访问(私有方法可以被外部调用) 注意此方法在jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数
      Type Parameters:
      T - AccessibleObject的子类,比如Class、Method、Field等
      Parameters:
      accessibleObject - 可设置访问权限的对象,比如Class、Method、Field等
      Returns:
      被设置可访问的对象
      Throws:
      SecurityException - 访问被禁止抛出此异常
    • getConstructor

      public static <T> Constructor<T> getConstructor(Class<T> clazz, Class<?>... parameterTypes)
      查找类中的指定参数的构造方法,如果找到构造方法,会自动设置可访问为true
      Type Parameters:
      T - 对象类型
      Parameters:
      clazz - 类
      parameterTypes - 参数类型,只要任何一个参数是指定参数的父类或接口或相等即可,此参数可以不传
      Returns:
      构造方法,如果未找到返回null
    • getConstructors

      public static <T> Constructor<T>[] getConstructors(Class<T> beanClass) throws SecurityException
      获得一个类中所有构造列表
      Type Parameters:
      T - 构造的对象类型
      Parameters:
      beanClass - 类,非null
      Returns:
      字段列表
      Throws:
      SecurityException - 安全检查异常
    • getConstructorsDirectly

      public static Constructor<?>[] getConstructorsDirectly(Class<?> beanClass) throws SecurityException
      获得一个类中所有构造列表,直接反射获取,无缓存
      Parameters:
      beanClass - 类
      Returns:
      字段列表
      Throws:
      SecurityException - 安全检查异常
    • newInstance

      public static <T> T newInstance(String clazz) throws InternalException
      实例化对象 类必须有空构造函数
      Type Parameters:
      T - 对象类型
      Parameters:
      clazz - 类名
      Returns:
      对象
      Throws:
      InternalException - 包装各类异常
    • newInstance

      public static <T> T newInstance(Class<T> clazz, Object... params) throws InternalException
      实例化对象
      Type Parameters:
      T - 对象类型
      Parameters:
      clazz - 类
      params - 构造函数参数
      Returns:
      对象
      Throws:
      InternalException - 包装各类异常
    • newInstanceIfPossible

      public static <T> T newInstanceIfPossible(Class<T> type)
      尝试遍历并调用此类的所有构造方法,直到构造成功并返回 对于某些特殊的接口,按照其默认实现实例化,例如:
           Map       - HashMap
           Collction - ArrayList
           List      - ArrayList
           Set       - HashSet
       
      Type Parameters:
      T - 对象类型
      Parameters:
      type - 被构造的类
      Returns:
      构造后的对象,构造失败返回null