Hutool 是一个 Java 工具包,它帮忙咱们简化每一行代码,防止反复造轮子。如果你有须要用到某些工具办法的时候,无妨在 Hutool 外面找找,可能就有。本文将对 Hutool 中的常用工具类和办法进行介绍。 ## 一、简介 一个 Java 根底工具类,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 办法进行封装,组成各种 Util 工具类,同时提供以下组件:
- hutool-core 外围,包含 Bean 操作、日期、各种 Util 等
- hutool-aop JDK 动静代理封装,提供非 IOC 下的切面反对
- hutool-bloomFilter 布隆过滤,提供一些 Hash 算法的布隆过滤
- hutool-cache 缓存
- hutool-cron 定时工作模块,提供类 Crontab 表达式的定时工作
- hutool-crypto 加密解密模块
- hutool-db JDBC 封装后的数据操作,基于 ActiveRecord 思维
- hutool-dfa 基于 DFA 模型的多关键字查找
- hutool-extra 扩大模块,对第三方封装(模板引擎、邮件等)
- hutool-http 基于 HttpUrlConnection 的 Http 客户端封装
- hutool-log 自动识别日志实现的日志门面
- hutool-script 脚本执行封装,例如 Javascript
- hutool-setting 性能更弱小的 Setting 配置文件和 Properties 封装
- hutool-system 零碎参数调用封装(JVM 信息等)
- hutool-json JSON 实现
- hutool-captcha 图片验证码实现
二、装置
maven 我的项目在 pom.xml 增加以下依赖即可:
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.2.2</version></dependency>复制代码
三、常用工具类
1. DateUtil
日期工夫工具类,定义了一些罕用的日期工夫操作方法。
Date、long、Calendar 之间的互相转换
//以后工夫Date date = DateUtil.date();//以后工夫Date date2 = DateUtil.date(Calendar.getInstance());//以后工夫Date date3 = DateUtil.date(System.currentTimeMillis());//以后工夫字符串,格局:yyyy-MM-dd HH:mm:ssString now = DateUtil.now();//以后日期字符串,格局:yyyy-MM-ddString today= DateUtil.today();复制代码
字符串转日期
DateUtil.parse
办法会自动识别一些罕用格局,包含:
- yyyy-MM-dd HH:mm:ss
- yyyy-MM-dd
- HH:mm:ss
- yyyy-MM-dd HH:mm
- yyyy-MM-dd HH:mm:ss.SSS
String dateStr = "2020-03-01";Date date = DateUtil.parse(dateStr);复制代码
咱们也能够应用自定义日期格局转化:
String dateStr = "2020/03/02";Date date = DateUtil.parse(dateStr, "yyyy/MM/dd");复制代码
格式化日期输入
//后果 2020/03/01String format = DateUtil.format(date, "yyyy/MM/dd");//罕用格局的格式化String formatDate = DateUtil.formatDate(date);String formatDateTime = DateUtil.formatDateTime(date);String formatTime = DateUtil.formatTime(date);复制代码
获取 Date 对象的某个局部
//取得年的局部int year = DateUtil.year(date);//取得月份,从0开始计数int month = DateUtil.month(date);//取得月份,从0开始计数Month monthEnum = DateUtil.monthEnum(date);//取得日int dayOfMonth = DateUtil.dayOfMonth(date);//取得星期数,从周日算起int dayOfWeek = DateUtil.dayOfWeek(date);//取得星期枚举Week dayOfWeekEnum = DateUtil.dayOfWeekEnum(date);复制代码
开始和完结工夫
有的时候咱们须要取得每天的开始工夫、完结工夫,每月的开始和完结工夫等等,DateUtil 也提供了相干办法:
//一天的开始,后果:2020-03-01 00:00:00Date beginOfDay = DateUtil.beginOfDay(date);//一天的完结,后果:2020-03-01 23:59:59Date endOfDay = DateUtil.endOfDay(date);复制代码
日期工夫偏移
日期或工夫的偏移指针对某个日期减少或缩小分、小时、天等等,达到日期变更的目标。Hutool 也针对其做了大量封装
Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);DateTime newDate2 = DateUtil.offsetDay(date, 3);DateTime newDate3 = DateUtil.offsetHour(date, -3);复制代码
针对以后工夫,提供了简化的偏移办法(例如昨天、上周、上个月等):
//昨天DateUtil.yesterday()//今天DateUtil.tomorrow()//上周DateUtil.lastWeek()//下周DateUtil.nextWeek()//上个月DateUtil.lastMonth()//下个月DateUtil.nextMonth()复制代码
日期时间差
有时候咱们须要计算两个日期之间的时间差(相差天数、相差小时数等等),Hutool 将此类办法封装为 between 办法:
long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);复制代码
计时器
计时器用于计算某段代码或过程破费的工夫
TimeInterval timer = DateUtil.timer();//---------------------------------//-------这是执行过程//---------------------------------timer.interval();//破费毫秒数timer.intervalRestart();//返回破费工夫,并重置开始工夫timer.intervalMinute();//破费分钟数复制代码
其它
//年龄DateUtil.ageOfNow("1993-03-01");//是否平年DateUtil.isLeapYear(2017);复制代码
2. Convert
类型转换工具类,用于各种类型数据的转换。外面封装了针对 Java 常见类型的转换,用于简化类型转换。Convert 类中大部分办法为 toXXX,参数为 Object,能够实现将任意可能的类型转换为指定类型。同时反对第二个参数 defaultValue 用于在转换失败时返回一个默认值。 ####Java 常见类型转换
- 转换为字符串:
int a = 1;//aStr为"1"String aStr = Convert.toStr(a);long[] b = {1,2,3,4,5};//bStr为:"[1, 2, 3, 4, 5]"String bStr = Convert.toStr(b);复制代码
- 转换为指定类型数组:
String[] b = { "1", "2", "3", "4" };//后果为Integer数组Integer[] intArray = Convert.toIntArray(b);long[] c = {1,2,3,4,5};//后果为Integer数组Integer[] intArray2 = Convert.toIntArray(c);复制代码
- 转换为日期对象:
String a = "2020-03-01";Date value = Convert.toDate(a);复制代码
- 转换为汇合
Object[] a = {"a", "你", "好", "", 1};List<?> list = Convert.convert(List.class, a);//从4.1.11开始能够这么用List<?> list = Convert.toList(a);复制代码
其它类型转换
- 规范类型
通过Convert.convert(Class<T>, Object)
办法能够将任意类型转换为指定类型,Hutool 中预约义了许多类型转换,例如转换为 URI、URL、Calendar 等等。
- 泛型类型
通过convert(TypeReference<T> reference, Object value)
办法,自行 new 一个TypeReference
对象能够对嵌套泛型进行类型转换。例如,咱们想转换一个对象为List<String>
类型,此时传入的规范 Class 就无奈满足要求,此时咱们能够这样:
Object[] a = { "a", "你", "好", "", 1 };List<String> list = Convert.convert(new TypeReference<List<String>>() {}, a);复制代码
通过 TypeReference 实例化后制订泛型类型,即可转换对象为咱们想要的指标类型。
半角和全角转换
在很多文本的统一化中这两个办法十分有用,次要对标点符号的全角半角转换。
半角转全角:
String a = "123456789,$()?!:;";//后果为:"123456789,$()?!:;"String sbc = Convert.toSBC(a);复制代码
全角转半角:
String a = "123456789,$()?!:;";//后果为"123456789,$()?!:;"String dbc = Convert.toDBC(a);复制代码
16 进制(Hex)
在很多加密解密,以及中文字符串传输(比方表单提交)的时候,会用到 16 进制转换,就是 Hex 转换,为此 Hutool 中专门封装了 HexUtil 工具类,思考到 16 进制转换也是转换的一部分,因而将其办法也放在 Convert 类中,便于了解和查找,应用同样非常简单:
转为 16 进制(Hex)字符串
String a = "字符串";String hex = Convert.toHex(a, CharsetUtil.CHARSET_UTF_8);复制代码
将 16 进制(Hex)字符串转为一般字符串:
String hex = "e5ad97e7aca6e4b8b2";String raw = Convert.hexToStr(hex, CharsetUtil.CHARSET_UTF_8);复制代码
因为字符串牵涉到编码问题,因而必须传入编码对象,此处应用 UTF-8 编码。 toHex 办法同样反对传入 byte[],同样也能够应用 hexToBytes 办法将 16 进制转为 byte[]
Unicode 和字符串转换
与 16 进制相似,Convert 类同样能够在字符串和 Unicode 之间轻松转换:
String unicode = Convert.strToUnicode(a);String raw = Convert.unicodeToStr(unicode);复制代码
编码转换
在接管表单的时候,咱们经常被中文乱码所困扰,其实大多数起因是应用了不正确的编码方式解码了数据。于是Convert.convertCharset
办法便派上用场了,它能够把乱码转为正确的编码方式:
String a = "我不是乱码";//转换后result为乱码String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);String raw = Convert.convertCharset(result, CharsetUtil.ISO_8859_1, "UTF-8");Assert.assertEquals(raw, a);复制代码
工夫单位转换
Convert.convertTime
办法次要用于转换时长单位,比方一个很大的毫秒,我想取得这个毫秒数对应多少分:
long a = 4535345;//后果为:75long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);复制代码
金额大小写转换
面对财务类需要,Convert.digitToChinese
将金钱数转换为大写模式:
double money = 1234.56;//后果为:"壹仟贰佰叁拾肆元伍角陆分"String digitUppercase = Convert.digitToChinese(a);复制代码
留神 转换为大写只能准确到分(小数点儿后两位),之后的数字会被疏忽。
原始类和包装类转换
有的时候,咱们须要将包装类和原始类互相转换(比方 Integer.classs 和 int.class),这时候咱们能够:
//去包装Class<?> wrapClass = Integer.class;//后果为:int.classClass<?> unWraped = Convert.unWrap(wrapClass);//包装Class<?> primitiveClass = long.class;//后果为:Long.classClass<?> wraped = Convert.wrap(primitiveClass);复制代码
3. StrUtil
字符串工具类,定义了一些罕用的字符串操作方法。 #### hasBlank、hasEmpty 办法
就是给定一些字符串,如果一旦有空的就返回 true,罕用于判断好多字段是否有空的(例如 web 表单数据)。
这两个办法的区别是hasEmpty
只判断是否为 null 或者空字符串(""),hasBlank
则会把不可见字符也算做空,isEmpty
和isBlank
同理。
removePrefix、removeSuffix 办法
这两个是去掉字符串的前缀后缀的,例如去个文件名的扩展名啥。
String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg") //fileName -> pretty_girl复制代码
还有疏忽大小写的removePrefixIgnoreCase
和removeSuffixIgnoreCase
都比拟实用。
sub 办法
subString 办法越界会报异样,得本人判断,sub 把各种状况判断都加进来了,而且 index 的地位还反对正数,-1 示意最初一个字符,如果不小心把第一个地位和第二个地位搞反了,也会主动修改
String str = "abcdefgh";String strSub1 = StrUtil.sub(str, 2, 3);String strSub2 = StrUtil.sub(str, 2, -3); String strSub3 = StrUtil.sub(str, 3, 2); 复制代码
format 办法
String template = "{}和{}";String str = StrUtil.format(template, "我", "你");复制代码
参数是 Object 类型,传别的类型会主动调用 toString() 办法。
4. NumberUtil
数字解决工具类,可用于各种类型数字的加减乘除操作及判断类型。
double n1 = 1.234;double n2 = 1.234;double result;//对float、double、BigDecimal做加减乘除操作result = NumberUtil.add(n1, n2);result = NumberUtil.sub(n1, n2);result = NumberUtil.mul(n1, n2);result = NumberUtil.div(n1, n2);//保留两位小数BigDecimal roundNum = NumberUtil.round(n1, 2);String n3 = "1.234";//判断是否为数字、整数、浮点数NumberUtil.isNumber(n3);NumberUtil.isInteger(n3);NumberUtil.isDouble(n3);复制代码
5. BeanUtil
JavaBean 的工具类,可用于 Map 与 JavaBean 对象的相互转换以及对象属性的拷贝。
Map 转 Bean
提供了 Map 对象键值对注入 Bean,其办法有:
BeanUtil.fillBeanWithMap
应用 Map 填充 bean
HashMap<String, Object> map = CollUtil.newHashMap();map.put("name", "Joe");map.put("age", 12);map.put("openId", "DFDFSDFWERWER");Person person = BeanUtil.fillBeanWithMap(map, new Person(), false);复制代码
BeanUtil.fillBeanWithMapIgnoreCase
应用 Map 填充 bean,疏忽大小写
HashMap<String, Object> map = CollUtil.newHashMap();map.put("Name", "yxm");map.put("aGe", 12);map.put("openId", "DFDFSDFWERWER");Person person = BeanUtil.fillBeanWithMapIgnoreCase(map, new Person(), false);复制代码
同时提供了 map 转 bean 的办法,与 fillBean 不同的是,此处并不是传 Bean 对象,而是 Bean 类,Hutool 会主动调用默认构造方法创建对象。当然,前提是 Bean 类有默认构造方法(空结构),这些办法有:
- mapToBean,mapToBeanIgnoreCase
// 设置别名,用于对应bean的字段名HashMap<String, String> mapping = CollUtil.newHashMap();mapping.put("a_name", "name");mapping.put("b_age", "age");Person person = BeanUtil.mapToBean(map, Person.class, CopyOptions.create().setFieldMapping(mapping));复制代码
Bean 转为 Map
BeanUtil.beanToMap
办法则是将一个 Bean 对象转为 Map 对象。
Person person = new Person();person.setAge(14);person.setOpenid("11213232");person.setName("测试A11");person.setSubName("sub名字");Map<String, Object> map = BeanUtil.beanToMap(person);复制代码
Bean 转 Bean
Bean 之间的转换次要是雷同属性的复制,因而办法名为copyProperties
,此办法反对 Bean 和 Map 之间的字段复制。
BeanUtil.copyProperties
办法同样提供一个CopyOptions
参数用于自定义属性复制。
Person p1 = new Person();p1.setSlow(true);p1.setName("测试");p1.setSubName("sub测试");Map<String, Object> map = MapUtil.newHashMap();BeanUtil.copyProperties(p1, map);复制代码
6. ReflectUtil
Java 反射工具类,可用于反射获取类的办法及创建对象。
//获取某个类的所有办法Method[] methods = ReflectUtil.getMethods(PmsBrand.class);//获取某个类的指定办法Method method = ReflectUtil.getMethod(PmsBrand.class, "getId");//应用反射来创建对象PmsBrand pmsBrand = ReflectUtil.newInstance(PmsBrand.class);//反射执行对象的办法ReflectUtil.invoke(pmsBrand, "setId", 1);复制代码
7. CollUtil
汇合操作的工具类,定义了一些罕用的汇合操作。
//数组转换为列表String[] array = new String[]{"a", "b", "c", "d", "e"};List<String> list = CollUtil.newArrayList(array);List<String> list2 = CollUtil.newArrayList("1","2","3");//join:数组转字符串时增加连贯符号String joinStr = CollUtil.join(list, ",");//将以连贯符号分隔的字符串再转换为列表List<String> splitList = StrUtil.split(joinStr, ',');//创立新的Map、Set、ListHashMap<Object, Object> newMap = CollUtil.newHashMap();HashSet<Object> newHashSet = CollUtil.newHashSet();ArrayList<Object> newList = CollUtil.newArrayList();//判断列表是否为空CollUtil.isEmpty(list);复制代码
zip
办法:给定两个汇合,而后两个汇合中的元素一一对应,成为一个 Map。此办法还有一个重载办法,能够传字符,而后给定分分隔符,字符串会被 split 成列表。
List<String> keys = CollUtil.newArrayList("a", "b", "c");List<Integer> values = CollUtil.newArrayList(1, 2, 3);Map<String, Integer> map = CollUtil.zip(keys, values);System.out.println(map); // {b=2, c=3, a=1}String a = "a,b,c";String b = "1,2,3";Map<String, String> map2 = CollUtil.zip(a, b, ",");System.out.println(map2); // {b=2, c=3, a=1}复制代码
8. MapUtil
Map 操作工具类,可用于创立 Map 对象及判断 Map 是否为空。
//将多个键值对退出到Map中Map<Object, Object> map = MapUtil.of(new String[][]{ {"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"}});//判断Map是否为空MapUtil.isEmpty(map);MapUtil.isNotEmpty(map);复制代码
- toListMap 行转列,合并雷同的键,值合并为列表,将 Map 列表中雷同 key 的值组成列表做为 Map 的 value,例如传入数据是:
[{a: 1, b: 1, c: 1} {a: 2, b: 2} {a: 3, b: 3} {a: 4} ]
后果为:
{a: [1,2,3,4] b: [1,2,3,] c: [1] }
- toMapList 列转行。将 Map 中值列表别离依照其地位与 key 组成新的 map
- join、joinIgnoreNull 将 Map 依照给定的分隔符转换为字符串
- reverse Map 的键和值调换
- sort 排序 Map
- getAny 获取 Map 的局部 key 生成新的 Map
- get、getXXX 获取 Map 中指定类型的值
9. AnnotationUtil
注解工具类,可用于获取注解与注解中指定的值。
//获取指定类、办法、字段、结构器上的注解列表Annotation[] annotationList = AnnotationUtil.getAnnotations(HutoolController.class, false);//获取指定类型注解Api api = AnnotationUtil.getAnnotation(HutoolController.class, Api.class);//获取指定类型注解的值Object annotationValue = AnnotationUtil.getAnnotationValue(HutoolController.class, RequestMapping.class);复制代码
10. SecureUtil
加密解密工具类,可用于 MD5 加密。
//MD5加密String str = "123456";String md5Str = SecureUtil.md5(str);LOGGER.info("secureUtil md5:{}", md5Str);复制代码
对称加密
SecureUtil.aes
SecureUtil.des
摘要算法
SecureUtil.md5
SecureUtil.sha1
SecureUtil.hmac
SecureUtil.hmacMd5
SecureUtil.hmacSha1
非对称加密
SecureUtil.rsa
SecureUtil.dsa
UUID
SecureUtil.simpleUUID
办法提供无 “-” 的 UUID
密钥生成
SecureUtil.generateKey
针对对称加密生成密钥SecureUtil.generateKeyPair
生成密钥对(用于非对称加密)SecureUtil.generateSignature
生成签名(用于非对称加密)
其余工具类
Hutool 中的工具类很多,能够参考:www.hutool.cn/
四、我的项目源码地址
github.com/macrozheng/…