Hutool Hutool
(opens new window)
🏡首页
📖指南
🎢最佳实践
💖支持
💡javaDoc (opens new window)
⏳更新记录 (opens new window)
  • 🍎gitee (opens new window)
  • 🍏github (opens new window)
(opens new window)
🏡首页
📖指南
🎢最佳实践
💖支持
💡javaDoc (opens new window)
⏳更新记录 (opens new window)
  • 🍎gitee (opens new window)
  • 🍏github (opens new window)
  • 快速入门

  • 核心(hutool-core)

    • AI(Hutool-ai)

    • 注解(annotation)

    • 数组(array)

    • JavaBean(bean)

    • 缓存(cache)

    • 类加载器(classloader)

    • 编码解码(codec)

    • 集合(collection)

    • 比较器(comparator)

    • 压缩(compress)

    • 类型转换(convert)

    • 数据(data)

    • 日期时间(date)

    • 异常(exception)

    • 函数(func)

    • IO流(io)

    • 语言特性(lang)

    • Map(map)

    • 数字数学(math)

    • 网络(net)

    • 对象池(pool)

    • 反射(reflect)

      • 反射
      • 类工具-ClassUtil
      • 反射工具-ReflectUtil
      • 字段工具-FieldUtil
      • 构造器工具-ConstructorUtil
      • 类型工具-TypeUtil
      • ClassScanner 类扫描器
      • JDK代理工具-JdkProxyUtil
      • 修饰符工具-ModifierUtil
      • 类描述工具-ClassDescUtil
        • 1. 功能概述
        • 2. 核心功能
          • 2.1 类描述符与Class对象转换
          • 2.2 类描述生成
          • 2.3 类名处理
          • 2.4 类名与描述符转换
          • 2.5 其他功能
        • 3. 方法详解
          • 3.1 类描述符与Class对象转换
          • descToClass(desc)
          • descToClass(desc, isInitialized, cl)
          • 3.2 类描述生成
          • getDesc(c)
          • getDesc(methodOrConstructor, appendName)
          • 3.3 类名处理
          • getName(c)
          • getName(executable)
          • 3.4 类名与描述符转换
          • nameToClass(name, isInitialized, cl)
          • nameToDesc(name)
          • descToName(desc)
          • 3.5 其他功能
          • getCodeBase(clazz)
        • 4. 示例代码
          • 4.1 类描述符与Class对象转换
          • 4.2 方法描述符生成
          • 4.3 类名与描述符转换
          • 4.4 类名称转Class对象
        • 5. 注意事项
        • 6. 最佳实践
    • 正则(regex)

    • 服务提供(spi)

    • 聚合操作(stream)

    • 字符串文本(text)

    • 并发和线程(thread)

    • 树结构(tree)

    • 工具集合(util)

    • XML操作(xml)

  • 定时任务(hutool-cron)

  • 加密(hutool-crypto)

  • 数据库(hutool-db)

  • 扩展(hutool-extra)

  • HTTP(hutool-http)

  • 日志(hutool-log)

  • 配置文件(hutool-setting)

  • JSON(hutool-json)

  • Office办公(hutool-poi)

  • 套接字(hutool-socket)

  • GUI(hutool-swing)

  • 指南
  • 核心(hutool-core)
  • 反射(reflect)
Hutool
2026-01-24
目录

类描述工具-ClassDescUtil

# 1. 功能概述

ClassDescUtil 是 Hutool 提供的类描述工具类,用于处理 Java 类的描述信息。该工具类实现了类描述符与 Class 对象之间的转换,以及方法和构造函数的描述生成,支持字节码级别的类型表示。

在字节码中,类型表示如下:

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

# 2. 核心功能

# 2.1 类描述符与Class对象转换

  • descToClass(desc):将类描述转换为Class对象
  • descToClass(desc, isInitialized, cl):将类描述转换为Class对象,可指定是否初始化和类加载器

# 2.2 类描述生成

  • getDesc(c):获取类的描述符
  • getDesc(methodOrConstructor, appendName):获取方法或构造函数的描述符

# 2.3 类名处理

  • getName(c):获得类名称,数组输出xxx[]形式
  • getName(executable):获取构造或方法的名称表示

# 2.4 类名与描述符转换

  • nameToClass(name, isInitialized, cl):将类名称转换为Class对象
  • nameToDesc(name):将类名称转换为描述符
  • descToName(desc):将类描述符转换为名称

# 2.5 其他功能

  • getCodeBase(clazz):获取类的代码基地址

# 3. 方法详解

# 3.1 类描述符与Class对象转换

# descToClass(desc)

功能:将类描述转换为Class对象

参数:

  • desc:类描述

返回值:Class对象

异常:

  • HutoolException:类没有找到

示例:

// 将类描述转换为Class对象
Class<?> booleanArrayClass = ClassDescUtil.descToClass("[Z"); // 返回 boolean[].class
Class<?> mapArrayClass = ClassDescUtil.descToClass("[[Ljava/util/Map;"); // 返回 java.util.Map[][].class

# descToClass(desc, isInitialized, cl)

功能:将类描述转换为Class对象

参数:

  • desc:类描述
  • isInitialized:是否初始化类
  • cl:类加载器

返回值:Class对象

异常:

  • HutoolException:类没有找到

示例:

// 使用自定义类加载器将类描述转换为Class对象
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class<?> clazz = ClassDescUtil.descToClass("Ljava/lang/String;", false, classLoader); // 返回 String.class

# 3.2 类描述生成

# getDesc(c)

功能:获取类的描述符

参数:

  • c:类对象

返回值:类描述符

示例:

// 获取不同类型的描述符
String booleanDesc = ClassDescUtil.getDesc(boolean.class); // 返回 "Z"
String booleanWrapperDesc = ClassDescUtil.getDesc(Boolean.class); // 返回 "Ljava/lang/Boolean;"
String doubleArrayDesc = ClassDescUtil.getDesc(double[][][].class); // 返回 "[[[D"
String intDesc = ClassDescUtil.getDesc(int.class); // 返回 "I"
String integerDesc = ClassDescUtil.getDesc(Integer.class); // 返回 "Ljava/lang/Integer;"

# getDesc(methodOrConstructor, appendName)

功能:获取方法或构造函数的描述符

参数:

  • methodOrConstructor:方法或构造函数对象
  • appendName:是否包含方法名称

返回值:方法或构造函数描述符

示例:

// 获取方法描述符
Method hashCodeMethod = Object.class.getMethod("hashCode");
String hashCodeDesc = ClassDescUtil.getDesc(hashCodeMethod, false); // 返回 "()I"

Method toStringMethod = Object.class.getMethod("toString");
String toStringDesc = ClassDescUtil.getDesc(toStringMethod, false); // 返回 "()Ljava/lang/String;"

Method equalsMethod = Object.class.getMethod("equals", Object.class);
String equalsDesc = ClassDescUtil.getDesc(equalsMethod, false); // 返回 "(Ljava/lang/Object;)Z"

# 3.3 类名处理

# getName(c)

功能:获得类名称,数组输出xxx[]形式

参数:

  • c:类对象

返回值:类名称

示例:

// 获取类名称
String objectName = ClassDescUtil.getName(Object.class); // 返回 "java.lang.Object"
String objectArrayName = ClassDescUtil.getName(Object[][].class); // 返回 "java.lang.Object[][]"

# getName(executable)

功能:获取构造或方法的名称表示

参数:

  • executable:方法或构造函数对象

返回值:构造或方法的名称表示

示例:

// 获取方法名称表示
Method hashCodeMethod = Object.class.getMethod("hashCode");
String hashCodeName = ClassDescUtil.getName(hashCodeMethod); // 返回 "(int)"

Method equalsMethod = Object.class.getMethod("equals", Object.class);
String equalsName = ClassDescUtil.getName(equalsMethod); // 返回 "(boolean java.lang.Object)"

# 3.4 类名与描述符转换

# nameToClass(name, isInitialized, cl)

功能:将类名称转换为Class对象

参数:

  • name:类名称
  • isInitialized:是否初始化类
  • cl:类加载器

返回值:Class对象

示例:

// 将类名称转换为Class对象
Class<?> booleanClass = ClassDescUtil.nameToClass("boolean", false, null); // 返回 boolean.class
Class<?> mapArrayClass = ClassDescUtil.nameToClass("java.util.Map[][]", false, null); // 返回 java.util.Map[][].class

# nameToDesc(name)

功能:将类名称转换为描述符

参数:

  • name:类名称

返回值:类描述符

示例:

// 将类名称转换为描述符
String mapArrayDesc = ClassDescUtil.nameToDesc("java.util.Map[][]"); // 返回 "[[Ljava/util/Map;"

# descToName(desc)

功能:将类描述符转换为名称

参数:

  • desc:类描述符

返回值:类名称

示例:

// 将类描述符转换为名称
String intArrayName = ClassDescUtil.descToName("[[I"); // 返回 "int[][]"

# 3.5 其他功能

# getCodeBase(clazz)

功能:获取类的代码基地址

参数:

  • clazz:类对象

返回值:类的代码基地址

示例:

// 获取String类的代码基地址
String codeBase = ClassDescUtil.getCodeBase(String.class);
Console.log("String类的代码基地址:{}", codeBase);

# 4. 示例代码

# 4.1 类描述符与Class对象转换

// 基本类型转换
Class<?> booleanClass = ClassDescUtil.descToClass("Z");
Class<?> intClass = ClassDescUtil.descToClass("I");
Class<?> voidClass = ClassDescUtil.descToClass("V");

Console.log("boolean描述符转换:{}", booleanClass); // boolean
Console.log("int描述符转换:{}", intClass); // int
Console.log("void描述符转换:{}", voidClass); // void

// 对象类型转换
Class<?> stringClass = ClassDescUtil.descToClass("Ljava/lang/String;");
Class<?> listClass = ClassDescUtil.descToClass("Ljava/util/List;");

Console.log("String描述符转换:{}", stringClass); // class java.lang.String
Console.log("List描述符转换:{}", listClass); // interface java.util.List

// 数组类型转换
Class<?> stringArrayClass = ClassDescUtil.descToClass("[Ljava/lang/String;");
Class<?> intArrayClass = ClassDescUtil.descToClass("[[I");

Console.log("String[]描述符转换:{}", stringArrayClass); // class [Ljava.lang.String;
Console.log("int[][]描述符转换:{}", intArrayClass); // class [[I

# 4.2 方法描述符生成

// 获取方法对象
Method[] methods = String.class.getMethods();

// 打印前5个方法的描述符
for (int i = 0; i < Math.min(5, methods.length); i++) {
    Method method = methods[i];
    String descWithoutName = ClassDescUtil.getDesc(method, false);
    String descWithName = ClassDescUtil.getDesc(method, true);

    Console.log("方法:{}", method.getName());
    Console.log("  不带名称的描述符:{}", descWithoutName);
    Console.log("  带名称的描述符:{}", descWithName);
    Console.log("  方法名称表示:{}", ClassDescUtil.getName(method));
}

# 4.3 类名与描述符转换

// 类名转描述符
String desc1 = ClassDescUtil.nameToDesc("java.lang.String");
String desc2 = ClassDescUtil.nameToDesc("int[][]");
String desc3 = ClassDescUtil.nameToDesc("java.util.Map<java.lang.String, java.lang.Integer>");

Console.log("java.lang.String -> {}", desc1); // Ljava/lang/String;
Console.log("int[][] -> {}", desc2); // [[I
Console.log("java.util.Map<java.lang.String, java.lang.Integer> -> {}", desc3); // Ljava.util.Map<java.lang.String, java.lang.Integer>;

// 描述符转类名
String name1 = ClassDescUtil.descToName("Ljava/lang/String;");
String name2 = ClassDescUtil.descToName("[[I");
String name3 = ClassDescUtil.descToName("[[Ljava/util/List;");

Console.log("Ljava/lang/String; -> {}", name1); // java.lang.String
Console.log("[[I -> {}", name2); // int[][]
Console.log("[[Ljava/util/List; -> {}", name3); // java.util.List[][]

# 4.4 类名称转Class对象

// 基本类型名称转Class
Class<?> booleanClass = ClassDescUtil.nameToClass("boolean", false, null);
Class<?> intClass = ClassDescUtil.nameToClass("int", false, null);
Class<?> voidClass = ClassDescUtil.nameToClass("void", false, null);

Console.log("boolean名称转换:{}", booleanClass); // boolean
Console.log("int名称转换:{}", intClass); // int
Console.log("void名称转换:{}", voidClass); // void

// 对象类型名称转Class
Class<?> stringClass = ClassDescUtil.nameToClass("java.lang.String", false, null);
Class<?> arrayListClass = ClassDescUtil.nameToClass("java.util.ArrayList", false, null);

Console.log("String名称转换:{}", stringClass); // class java.lang.String
Console.log("ArrayList名称转换:{}", arrayListClass); // class java.util.ArrayList

// 数组类型名称转Class
Class<?> stringArrayClass = ClassDescUtil.nameToClass("java.lang.String[]", false, null);
Class<?> intArrayClass = ClassDescUtil.nameToClass("int[][]", false, null);

Console.log("String[]名称转换:{}", stringArrayClass); // class [Ljava.lang.String;
Console.log("int[][]名称转换:{}", intArrayClass); // class [[I

# 5. 注意事项

  1. 类型表示:字节码中的类型表示与Java源码中的表示不同,需要注意转换规则
  2. 数组表示:数组类型在字节码中使用前置[字符表示维度,如[[I表示int[][]
  3. 对象类型:对象类型在字节码中以L开头,;结尾,如Ljava/lang/Object;
  4. 类加载:转换过程中可能涉及类加载,需要注意类加载器的选择
  5. 初始化控制:可以通过参数控制是否初始化类,非必要情况下建议不初始化
  6. 异常处理:转换过程中可能抛出HutoolException,需要适当处理
  7. 泛型类型:泛型类型的描述符转换可能不完整,因为泛型信息在运行时会被擦除

# 6. 最佳实践

  1. 动态类加载:在需要动态加载类的场景中,使用descToClass或nameToClass方法
  2. 方法签名生成:在需要生成方法签名的场景中,使用getDesc(method, appendName)方法
  3. 数组类型处理:使用getName(c)方法可以统一处理数组和非数组类型的名称
  4. 代码基地址获取:在需要获取类的代码位置时,使用getCodeBase(clazz)方法
  5. 类名与描述符转换:在需要在类名和描述符之间转换时,使用nameToDesc和descToName方法
  6. 性能考虑:对于频繁调用的转换操作,考虑缓存结果以提高性能
  7. 异常处理:在使用可能抛出异常的方法时,适当捕获和处理异常

ClassDescUtil 工具类为 Java 反射中的类描述信息处理提供了全面的支持,简化了类描述符与 Class 对象之间的转换,以及方法和构造函数描述的生成。无论是在动态类加载还是方法签名生成等场景中,该工具类都能提供便捷、高效的解决方案。

修饰符工具-ModifierUtil
正则表达式

← 修饰符工具-ModifierUtil 正则表达式→

Theme by Vdoing | Copyright © 2025-2026 Hutool | Apache-2.0
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式