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
        • 主要功能
        • API变更说明
        • 核心方法
          • setAccessibleQuietly(T accessibleObject)
          • setAccessible(T accessibleObject)
        • 示例代码
          • 设置方法可访问
          • 静默设置可访问
          • 结合其他工具类使用
        • 注意事项
        • 最佳实践
        • 总结
      • 字段工具-FieldUtil
      • 构造器工具-ConstructorUtil
      • 类型工具-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
目录

反射工具-ReflectUtil

# 反射工具-ReflectUtil

ReflectUtil是Hutool反射模块中的基础工具类,主要提供了设置AccessibleObject可访问性的功能。在v6.x版本中,该类进行了重构,原来的大部分方法被移动到了其他专门的工具类中,如FieldUtil、MethodUtil、ModifierUtil和ConstructorUtil等。

# 主要功能

  1. 设置可访问性:设置AccessibleObject(如Method、Field、Constructor等)为可访问状态,允许外部调用私有方法或访问私有字段
  2. 静默设置可访问性:在设置可访问性时忽略异常,静默处理

# API变更说明

在Hutool v6.x版本中,ReflectUtil的大部分方法被移动到了其他专门的工具类中,具体变更如下:

原方法 新方法 所属类
ReflectUtil#setFieldValue(Object, String, Object) setFieldValue(Object, String, Object) FieldUtil
ReflectUtil.setAccessible(ReflectUtil.getMethodByName(Xxx.class, "xxxMethodName")) setAccessible(AccessibleObject) + getMethodByName(Class, String) ReflectUtil + MethodUtil
ReflectUtil.removeFinalModify(Field) removeFinalModify(Field) ModifierUtil

# 核心方法

# setAccessibleQuietly(T accessibleObject)

设置方法为可访问(私有方法可以被外部调用),静默调用,抛出异常则跳过。

  • 参数:accessibleObject - 可设置访问权限的对象,比如Class、Method、Field等
  • 返回值:被设置可访问的对象
  • 注意:此方法在JDK9+中可能抛出异常,须添加--add-opens=java.base/java.lang=ALL-UNNAMED启动参数

# setAccessible(T accessibleObject)

设置方法为可访问(私有方法可以被外部调用)。

  • 参数:accessibleObject - 可设置访问权限的对象,比如Class、Method、Field等
  • 返回值:被设置可访问的对象
  • 抛出异常:SecurityException - 访问被禁止时抛出此异常
  • 注意:此方法在JDK9+中可能抛出异常,须添加--add-opens=java.base/java.lang=ALL-UNNAMED启动参数

# 示例代码

# 设置方法可访问

// 获取私有方法
Method privateMethod = MethodUtil.getMethod(MyClass.class, "privateMethod");

// 设置方法为可访问
ReflectUtil.setAccessible(privateMethod);

// 调用私有方法
MyClass obj = new MyClass();
Object result = privateMethod.invoke(obj);

# 静默设置可访问

// 获取私有字段
Field privateField = FieldUtil.getField(MyClass.class, "privateField");

// 静默设置字段为可访问(忽略可能的异常)
ReflectUtil.setAccessibleQuietly(privateField);

// 访问私有字段
MyClass obj = new MyClass();
Object value = privateField.get(obj);

# 结合其他工具类使用

// 结合MethodUtil使用
Method method = MethodUtil.getMethodByName(MyClass.class, "privateMethod");
ReflectUtil.setAccessible(method);

// 结合FieldUtil使用
Field field = FieldUtil.getField(MyClass.class, "privateField");
ReflectUtil.setAccessible(field);

// 结合ConstructorUtil使用
Constructor<MyClass> constructor = ConstructorUtil.getConstructor(MyClass.class, String.class);
ReflectUtil.setAccessible(constructor);

# 注意事项

  1. JDK版本限制:在JDK9+中,使用setAccessible方法可能会抛出SecurityException,需要添加以下启动参数:

    --add-opens=java.base/java.lang=ALL-UNNAMED
    
  2. API变更:在v6.x版本中,大部分方法已被移动到其他工具类中,使用时请注意导入正确的工具类

  3. 安全性考虑:设置私有方法或字段为可访问状态会破坏封装性,可能导致安全问题,使用时需谨慎

  4. 性能影响:反射操作本身就有性能开销,频繁使用可能影响系统性能

  5. 异常处理:setAccessible方法可能抛出SecurityException,建议使用try-catch块进行处理,或使用setAccessibleQuietly方法静默处理

# 最佳实践

  1. 优先使用专门的工具类:对于字段操作,优先使用FieldUtil;对于方法操作,优先使用MethodUtil;对于构造器操作,优先使用ConstructorUtil

  2. 合理使用可访问性设置:仅在必要时设置私有方法或字段为可访问状态,使用后考虑恢复访问权限

  3. 缓存反射结果:反射操作的性能开销较大,建议缓存反射结果,避免频繁获取Method、Field等对象

  4. 使用try-with-resources:如果反射操作涉及资源,建议使用try-with-resources语句确保资源正确关闭

  5. 添加JDK9+启动参数:在JDK9+环境中使用时,确保添加了必要的启动参数

# 总结

ReflectUtil是Hutool反射模块中的基础工具类,主要提供了设置AccessibleObject可访问性的功能。在v6.x版本中,该类进行了重构,大部分方法被移动到了其他专门的工具类中,使用时需要注意API的变更。

虽然ReflectUtil的功能相对简单,但它是反射操作的基础,结合其他专门的工具类,可以实现强大的反射功能。在使用时,需要注意JDK版本限制、安全性考虑和性能影响,遵循最佳实践,确保代码的健壮性和性能。

类工具-ClassUtil
字段工具-FieldUtil

← 类工具-ClassUtil 字段工具-FieldUtil→

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