当前位置: 首页 > ai >正文

Apache Commons ConvertUtils

Apache Commons BeanUtils 包中的ConvertUtils工具类,就像一位贴心的 "类型转换管家",将这些繁琐操作封装成简洁接口

一、原生类型转换的 "痛与泪"

先看一个典型场景:将 Web 表单提交的字符串参数转换为对应类型。用 JDK 原生方法实现是这样的:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class NativeConversionExample {public static void main(String[] args) {String ageStr = "25";String birthDateStr = "2023-01-15";String isActiveStr = "true";// 字符串转整数int age;try {age = Integer.parseInt(ageStr);} catch (NumberFormatException e) {throw new IllegalArgumentException("年龄格式错误", e);}// 字符串转日期Date birthDate;try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");birthDate = sdf.parse(birthDateStr);} catch (ParseException e) {throw new IllegalArgumentException("日期格式错误", e);}// 字符串转布尔值boolean isActive = Boolean.parseBoolean(isActiveStr);System.out.println("转换结果: age=" + age + ", birthDate=" + birthDate + ", isActive=" + isActive);}
}

这段代码仅实现三个简单的类型转换,就包含了:

  • 多个try-catch块处理转换异常

  • 手动创建日期格式化器

  • 不同类型转换逻辑分散,难以统一维护

而用ConvertUtils实现同样功能,代码量可减少 60%:

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.*;
import java.util.Date;
public class ConvertUtilsExample {public static void main(String[] args) {// 注册自定义转换器(日期转换)ConvertUtils.register(new DateConverter(null), Date.class);String ageStr = "25";String birthDateStr = "2023-01-15";String isActiveStr = "true";// 字符串转整数(自动处理异常)int age = ConvertUtils.convert(ageStr, Integer.class);// 字符串转日期(支持多种格式)Date birthDate = ConvertUtils.convert(birthDateStr, Date.class);// 字符串转布尔值boolean isActive = ConvertUtils.convert(isActiveStr, Boolean.class);System.out.println("转换结果: age=" + age + ", birthDate=" + birthDate + ", isActive=" + isActive);}
}

无需手动处理异常,无需关心具体转换逻辑,ConvertUtils通过统一接口实现了类型的安全转换。

二、ConvertUtils 核心功能:类型转换的 "全能工具箱"

ConvertUtils包含 20 + 个核心方法,支持 60 + 种类型转换,按功能可分为三大类:

1. 基础类型与包装类型转换

(1)字符串与基础类型互转
import org.apache.commons.beanutils.ConvertUtils;
public class BasicTypeConversion {public static void main(String[] args) {// 字符串转数字int intValue = ConvertUtils.convert("123", int.class); // 123double doubleValue = ConvertUtils.convert("3.14", double.class); // 3.14// 数字转字符串(自动处理null)String str1 = ConvertUtils.convert((Integer) null, String.class); // ""String str2 = ConvertUtils.convert(100, String.class); // "100"// 布尔值转换(支持多种格式:true/TRUE/1/yes等)boolean bool1 = ConvertUtils.convert("True", boolean.class); // trueboolean bool2 = ConvertUtils.convert("0", boolean.class); // false}
}
(2)数组与集合类型转换
import org.apache.commons.beanutils.ConvertUtils;
import java.util.Arrays;
public class CollectionConversion {public static void main(String[] args) {// 字符串数组转整数数组Integer[] intArray = ConvertUtils.convert(new String[]{"1", "2", "3"}, Integer[].class);// 集合转数组String[] strArray = ConvertUtils.convert(Arrays.asList("a", "b", "c"), String[].class);}
}
2.  时间戳与日期互转
(1)字符串与日期互转

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;
import java.util.Date;
public class DateConversion {public static void main(String[] args) {// 注册日期转换器(支持多种格式)DateConverter dateConverter = new DateConverter(null);dateConverter.setPatterns(new String[]{"yyyy-MM-dd", "MM/dd/yyyy"});ConvertUtils.register(dateConverter, Date.class);// 字符串转日期Date date1 = ConvertUtils.convert("2023-10-01", Date.class);Date date2 = ConvertUtils.convert("10/01/2023", Date.class);// 日期转字符串String dateStr = ConvertUtils.convert(date1, String.class);}
}
(2)时间戳与日期互转
import org.apache.commons.beanutils.ConvertUtils;
import java.util.Date;
public class TimestampConversion {public static void main(String[] args) {// 时间戳转日期Date date = ConvertUtils.convert(1696166400000L, Date.class); // 2023-10-01// 日期转时间戳long timestamp = ConvertUtils.convert(new Date(), Long.class);}
}

3. 复杂对象与集合转换

(1)字符串与对象互转
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.BeanConverter;
public class BeanConversion {public static void main(String[] args) {// 注册Bean转换器ConvertUtils.register(new BeanConverter(), User.class);// JSON字符串转对象(需配合JSON库)String json = "{\"name\":\"张三\",\"age\":25}";User user = ConvertUtils.convert(json, User.class);// 对象转字符串(调用toString())String userStr = ConvertUtils.convert(user, String.class);}
}
class User {private String name;private int age;// getter/setter略
}
(2)集合元素类型统一转换

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.Converter;
import java.util.Arrays;
import java.util.List;
public class CollectionElementConversion {public static void main(String[] args) {// 自定义集合元素转换器(字符串转整数)Converter converter = (input, targetType) -> {if (input == null) return null;return Integer.parseInt(input.toString());};// 注册转换器ConvertUtils.register(converter, Integer.class);// 集合元素批量转换List<String> strList = Arrays.asList("1", "2", "3");Integer[] intArray = ConvertUtils.convert(strList, Integer[].class);}
}

三、最佳实践与避坑指南

1. 依赖与版本管理

在 Maven 中引入commons-beanutils依赖:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-beanutils</artifactId><version>1.9.4</version>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency>

注意ConvertUtils属于commons-beanutils包,需单独引入。

2. 自定义转换器注册

对于框架不支持的特殊类型(如枚举、自定义日期格式),需注册自定义转换器:// 注册枚举转换器(字符串转枚举)

ConvertUtils.register((input, targetType) -> {    if (input == null) return null;    return Enum.valueOf((Class<Enum>) targetType, input.toString());}, Enum.class);

3. 异常处理策略

    • 全局捕获ConvertException,统一转换为业务异常

    • 对关键转换添加默认值处理:

    int age = ConvertUtils.convert("invalid", int.class, 0); // 转换失败返回0

    4. 性能优化

      • 避免在循环中频繁注册转换器,建议在应用启动时统一注册

      • 对大集合转换,优先使用数组转换而非集合转换(减少包装对象开销)

        http://www.xdnf.cn/news/19390.html

        相关文章:

      • 电科金仓 KFS 场景化实践路径解析:从行业场景落地看技术价值转化
      • Redis面试重点-2
      • std::thread详解
      • JDK14安装步骤及下载(附小白详细教程)
      • 在Unity中,让子物体不随父物体移动或转动的方法!
      • 数据库索引abc,请问查询哪些字段能命中索引
      • APB验证VIP Agent的各个组件之间的通信
      • 【C++ 】string类:深拷贝与浅拷贝解析
      • ​​告别通用模型局限:5步微调实战指南​
      • 数值分析——非线性方程与方程组的数值解法之迭代法
      • [灵动微电子 MM32BIN560CN MM32SPIN0280]读懂电机MCU 模拟输入运放放大
      • NCCL-TEST ib集群测试UCX代替方案
      • unity tilemap grid 的中心轴
      • Linux中卸载和安装Nginx
      • Python爬虫实战:研究Figures与 Axes,构建社交平台具有决策价值的数据采集和分析系统
      • C 语言进程通信之信号API
      • python---封装
      • MySQL 8 的 SQL 语法新特性
      • 《哲思:生命与宇宙的终极意义》
      • 【Canvas技法】绘制横向多色旗和竖向多色旗
      • Python入门教程:常用第三方库Matplotlib(基本用法)下载、安装、参数解析教程
      • ibping基本使用 以及 包丢失 超时 排障
      • 设计模式 | 常见的设计模式(单例、工厂、代理、适配器、责任链等等)
      • 2025年9月计算机二级C++语言程序设计——选择题打卡Day12
      • Langflow 多模态技术深度分析
      • Hysplit大气传输和污染扩散-轨迹聚合标准20%30%用途
      • OpenCV 图像直方图与对比度增强实战:从分析到优化
      • Week 14: 深度学习补遗:迁移学习
      • 《隐性质量:决定软件生命周期的看不见的竞争力》
      • Langflow Agents 技术深度分析