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
        • 1. 功能概述
        • 2. 核心功能
          • 2.1 构造方法获取
          • 2.2 对象实例化
        • 3. 方法详解
          • 3.1 构造方法获取
          • getConstructor(clazz, parameterTypes)
          • getConstructors(clazz)
          • getConstructorsDirectly(clazz)
          • 3.2 对象实例化
          • newInstance(clazz)
          • newInstance(clazz, params)
          • newInstanceIfPossible(type)
        • 4. 示例代码
          • 4.1 基本构造方法操作
          • 4.2 对象实例化
          • 4.3 接口实例化
        • 5. 注意事项
        • 6. 最佳实践
      • 类型工具-TypeUtil
      • ClassScanner 类扫描器
      • JDK代理工具-JdkProxyUtil
      • 修饰符工具-ModifierUtil
      • 类描述工具-ClassDescUtil
    • 正则(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
目录

构造器工具-ConstructorUtil

# 1. 功能概述

ConstructorUtil 是 Hutool 提供的反射构造器工具类,用于处理 Java 反射中的 Constructor 对象,提供了构造方法获取、对象实例化等功能。该工具类简化了 Java 反射中构造器操作的复杂性,提供了安全、高效的对象实例化方式。

# 2. 核心功能

# 2.1 构造方法获取

  • getConstructor(clazz, parameterTypes):查找类中的指定参数的构造方法
  • getConstructors(clazz):获取类中所有构造方法
  • getConstructorsDirectly(clazz):直接获取类中所有构造方法,无缓存

# 2.2 对象实例化

  • newInstance(clazz):实例化对象,类必须有空构造函数
  • newInstance(clazz, params):使用指定参数实例化对象
  • newInstanceIfPossible(type):尝试遍历调用所有构造方法,直到构造成功

# 3. 方法详解

# 3.1 构造方法获取

# getConstructor(clazz, parameterTypes)

功能:查找类中的指定参数的构造方法

参数:

  • clazz:类
  • parameterTypes:参数类型,只要任何一个参数是指定参数的父类或接口或相等即可,此参数可以不传

返回值:构造方法,如果未找到返回 null

说明:找到构造方法后,会自动设置可访问为 true

示例:

// 获取无参构造方法
Constructor<User> constructor1 = ConstructorUtil.getConstructor(User.class);

// 获取带参数的构造方法
Constructor<User> constructor2 = ConstructorUtil.getConstructor(User.class, String.class, int.class);

# getConstructors(clazz)

功能:获得一个类中所有构造列表

参数:

  • beanClass:类,非 null

返回值:构造方法列表

说明:使用缓存提高性能

示例:

Constructor<?>[] constructors = ConstructorUtil.getConstructors(User.class);
for (Constructor<?> constructor : constructors) {
    Console.log("构造方法:{}", constructor);
}

# getConstructorsDirectly(clazz)

功能:直接获取类中所有构造方法,无缓存

参数:

  • beanClass:类

返回值:构造方法列表

示例:

Constructor<?>[] constructors = ConstructorUtil.getConstructorsDirectly(User.class);
for (Constructor<?> constructor : constructors) {
    Console.log("构造方法:{}", constructor);
}

# 3.2 对象实例化

# newInstance(clazz)

功能:实例化对象

参数:

  • clazz:类名

返回值:实例化后的对象

说明:类必须有空构造函数

示例:

// 使用类名实例化
User user1 = ConstructorUtil.newInstance("com.example.User");

// 使用类对象实例化
User user2 = ConstructorUtil.newInstance(User.class);

# newInstance(clazz, params)

功能:使用指定参数实例化对象

参数:

  • clazz:类
  • params:构造函数参数

返回值:实例化后的对象

示例:

// 使用带参数的构造方法实例化
User user = ConstructorUtil.newInstance(User.class, "张三", 25);

# newInstanceIfPossible(type)

功能:尝试遍历并调用此类的所有构造方法,直到构造成功并返回

参数:

  • type:被构造的类

返回值:构造后的对象,构造失败返回 null

说明:对于某些特殊的接口,会按照默认实现实例化,例如:

  • Map -> HashMap
  • List -> ArrayList
  • Set -> HashSet
  • Queue -> LinkedList
  • Deque -> LinkedList
  • Collection -> ArrayList

示例:

// 实例化接口,会使用默认实现
List<String> list = ConstructorUtil.newInstanceIfPossible(List.class);
Map<String, Object> map = ConstructorUtil.newInstanceIfPossible(Map.class);

# 4. 示例代码

# 4.1 基本构造方法操作

// 获取所有构造方法
Constructor<?>[] constructors = ConstructorUtil.getConstructors(User.class);
Console.log("User类的所有构造方法:");
for (Constructor<?> constructor : constructors) {
    Console.log("构造方法:{}", constructor);
    Console.log("参数类型:{}", Arrays.toString(constructor.getParameterTypes()));
    Console.log("---");
}

// 获取指定参数的构造方法
Constructor<User> constructor = ConstructorUtil.getConstructor(User.class, String.class, int.class);
if (constructor != null) {
    Console.log("找到构造方法:{}", constructor);
    // 使用构造方法实例化对象
    User user = constructor.newInstance("张三", 25);
    Console.log("实例化对象:{}", user);
}

# 4.2 对象实例化

// 方法1:使用无参构造方法实例化
User user1 = ConstructorUtil.newInstance(User.class);
Console.log("无参构造实例化:{}", user1);

// 方法2:使用带参数的构造方法实例化
User user2 = ConstructorUtil.newInstance(User.class, "张三", 25);
Console.log("带参构造实例化:{}", user2);

// 方法3:使用类名字符串实例化
User user3 = ConstructorUtil.newInstance("com.example.User");
Console.log("类名字符串实例化:{}", user3);

# 4.3 接口实例化

// 实例化List接口,会使用ArrayList实现
List<String> list = ConstructorUtil.newInstanceIfPossible(List.class);
list.add("元素1");
list.add("元素2");
Console.log("List实例类型:{}", list.getClass().getName());
Console.log("List内容:{}", list);

// 实例化Map接口,会使用HashMap实现
Map<String, Object> map = ConstructorUtil.newInstanceIfPossible(Map.class);
map.put("key1", "value1");
map.put("key2", 123);
Console.log("Map实例类型:{}", map.getClass().getName());
Console.log("Map内容:{}", map);

// 实例化Set接口,会使用HashSet实现
Set<String> set = ConstructorUtil.newInstanceIfPossible(Set.class);
set.add("元素1");
set.add("元素2");
set.add("元素1"); // 重复元素会被去重
Console.log("Set实例类型:{}", set.getClass().getName());
Console.log("Set内容:{}", set);

# 5. 注意事项

  1. 性能优化:ConstructorUtil 使用了弱引用缓存(WeakConcurrentMap)来存储构造方法信息,提高了构造方法访问的性能。
  2. 安全访问:工具类会自动处理构造方法的可访问性,无需手动调用 setAccessible(true)。
  3. 异常处理:所有反射异常都会被包装为 HutoolException,统一异常处理。
  4. 空构造函数要求:newInstance(clazz) 方法要求类必须有空构造函数。
  5. 接口实例化:newInstanceIfPossible(type) 方法可以实例化接口,会使用默认实现类。
  6. 构造方法匹配:getConstructor(clazz, parameterTypes) 方法会查找参数类型匹配的构造方法,支持父类和接口的匹配。

# 6. 最佳实践

  1. 频繁实例化优化:对于频繁实例化的类,建议缓存 Constructor 对象,减少反射调用的开销。
  2. 优先使用newInstance方法:尽量使用 newInstance(clazz, params) 方法,它封装了构造方法查找和实例化的完整逻辑。
  3. 接口实例化:当需要实例化接口时,使用 newInstanceIfPossible(type) 方法可以自动选择合适的实现类。
  4. 异常处理:在使用反射实例化对象时,建议捕获 HutoolException 进行统一处理。
  5. 参数类型匹配:在查找构造方法时,注意参数类型的匹配,特别是基本类型和包装类型的区别。
  6. 避免过度使用:虽然反射提供了强大的动态能力,但过度使用会影响性能,建议在必要时才使用反射实例化。

ConstructorUtil 工具类为 Java 反射中的构造器操作提供了全面的支持,简化了构造方法获取和对象实例化的复杂性,是 Hutool 反射模块中的重要工具类之一。

字段工具-FieldUtil
类型工具-TypeUtil

← 字段工具-FieldUtil 类型工具-TypeUtil→

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