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)

      • 简介
      • Bean工具-BeanUtil
      • DynaBean
      • BeanPath
      • Bean描述-BeanDesc
        • 介绍
        • 使用
          • 字段get/Set方法获取
          • 一般字段
          • Boolean字段
          • 字段属性赋值
      • RecordUtil
    • 缓存(cache)

    • 类加载器(classloader)

    • 编码解码(codec)

    • 集合(collection)

    • 比较器(comparator)

    • 压缩(compress)

    • 类型转换(convert)

    • 数据(data)

    • 日期时间(date)

    • 异常(exception)

    • 函数(func)

    • IO流(io)

    • 语言特性(lang)

    • Map(map)

    • 数字数学(math)

    • 网络(net)

    • 对象池(pool)

    • 反射(reflect)

    • 正则(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)
  • JavaBean(bean)
Hutool
2026-01-03
目录

Bean描述-BeanDesc

# 介绍

Hutool封装了Bean的信息描述来将一个Bean的相关信息全部通过反射解析出来,此类类似于JDK的BeanInfo,也可以理解为是这个类的强化版本。

BeanDesc包含所有字段(属性)及对应的Getter方法和Setter方法,与BeanInfo不同的是,BeanDesc要求属性和getter、setter必须严格对应,即如果有非public属性,它没有对应的getter,则不能获取属性值,没有setter则不能注入属性值。

属性和getter、setter关联规则如下:

  1. 忽略字段和方法名的大小写(匹配时)
  2. 字段名是XXX,则Getter查找getXXX、isXXX、getIsXXX
  3. 字段名是XXX,Setter查找setXXX、setIsXXX
  4. Setter忽略参数值与字段值类型不匹配的情况,因此有多个参数类型的重载时,会调用首次匹配的

# 使用

我们定义一个较为复杂的Bean:

public static class User {
    private String name;
    private int age;
    private boolean isAdmin;
    private boolean isSuper;
    private boolean gender;
    private Boolean lastPage;
    private Boolean isLastPage;

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public User setAge(final int age) {
        this.age = age;
        return this;
    }

    public String testMethod() {
        return "test for " + this.name;
    }

    public boolean isAdmin() {
        return isAdmin;
    }

    public void setAdmin(final boolean isAdmin) {
        this.isAdmin = isAdmin;
    }

    public boolean isIsSuper() {
        return isSuper;
    }

    public void setIsSuper(final boolean isSuper) {
        this.isSuper = isSuper;
    }

    public boolean isGender() {
        return gender;
    }

    public void setGender(final boolean gender) {
        this.gender = gender;
    }

    public Boolean getIsLastPage() {
        return this.isLastPage;
    }

    public void setIsLastPage(final Boolean isLastPage) {
        this.isLastPage = isLastPage;
    }

    public Boolean getLastPage() {
        return this.lastPage;
    }

    public void setLastPage(final Boolean lastPage) {
        this.lastPage = lastPage;
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", isAdmin=" + isAdmin + ", gender=" + gender + "]";
    }
}

# 字段get/Set方法获取

# 一般字段

public void propDescTes() {
    final BeanDesc desc = BeanUtil.getBeanDesc(User.class);
    Assertions.assertEquals("User", desc.getSimpleName());

    Assertions.assertEquals("age", desc.getField("age").getName());
    Assertions.assertEquals("getAge", desc.getGetter("age").getName());
    Assertions.assertEquals("setAge", desc.getSetter("age").getName());
    Assertions.assertEquals(1, desc.getSetter("age").getParameterTypes().length);
    Assertions.assertSame(int.class, desc.getSetter("age").getParameterTypes()[0]);
}

# Boolean字段

我们会发现User中的boolean字段叫做isAdmin,此时同名的getter也可以获取到:

public void propDescOfBooleanTest() {
    final BeanDesc desc = BeanUtil.getBeanDesc(User.class);

    Assertions.assertEquals("isAdmin", desc.getGetter("isAdmin").getName());
    Assertions.assertEquals("setAdmin", desc.getSetter("isAdmin").getName());
    Assertions.assertEquals("isGender", desc.getGetter("gender").getName());
    Assertions.assertEquals("setGender", desc.getSetter("gender").getName());
}

当然,用户如果觉得isIsXXX才是正确的,BeanDesc也可以完美获取,我们以isSuper字段为例:


public void propDescOfBooleanTest2() {
    final BeanDesc desc = BeanUtil.getBeanDesc(User.class);
    // isIsSuper
    Assertions.assertEquals("isIsSuper", desc.getGetter("isSuper").getName());
    Assertions.assertEquals("setIsSuper", desc.getSetter("isSuper").getName());
}

# 字段属性赋值

public void getSetTest() {
    final BeanDesc desc = BeanUtil.getBeanDesc(User.class);

    final User user = new User();
    desc.getProp("name").setValue(user, "张三");
    Assertions.assertEquals("张三", user.getName());

    final Object value = desc.getProp("name").getValue(user);
    Assertions.assertEquals("张三", value);
}
BeanPath
RecordUtil

← BeanPath RecordUtil→

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