一個非常好用的Jar,可以幫你省去整合Utils的時間
本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲。轉載本文請聯系Java極客技術公眾號。
前段時間,阿粉在公司做功能的時候,出現了一個比較別致的需求,需要在頁面上顯示辛丑年x月x日,于是阿粉就在想,這個天干地支這玩意是不是有人做過封裝,能不能整合到Utils里面,以后都一起使用吧,于是就在 Google 上開始搜索有關的內容,結果不搜不知道,一搜嚇一跳,直接出現了一個完整的封裝好的 Jar 可以直接使用,于是阿粉就把這個 Jar 包的依賴加入到了自己的項目中,而且去源碼中扒拉了一下,感覺里面東西真心不錯,于是決定分享給大家一下。
Hutool
一個封裝了很多功能的 Jar ,阿粉要不是因為需求,估計可能很久不都不一定知道他,我們先來看看阿粉的需求是什么樣子的。
阿粉之前的需求是讓在后端返回一個所謂農歷的干支紀年,而這個東西就不是那么容易了呀,要自己去找一些Utils的話,大家可以看一下。
需要我們去專門弄這個么Utils,然后去計算干支紀年,這是不是有點麻煩了,而我們的 Hutool 這個 Jar 就非常的簡單了,
- ChineseDate chineseDate = new ChineseDate(date);
- String cyclical = chineseDate.getCyclical();
上面的代碼是獲取干支紀年,比如他還有獲取節日和生效的:
- /**
- * 獲得節日
- *
- * @return 獲得農歷節日
- */
- public String getFestivals() {
- return StrUtil.join(",", LunarFestival.getFestivals(this.year, this.month, day));
- }
- /**
- * 獲得年份生肖
- *
- * @return 獲得年份生肖
- */
- public String getChineseZodiac() {
- return Zodiac.getChineseZodiac(this.year);
- }
如果你只是認為這個 Jar 只能給你提供這一種幫助那就大錯特錯了,他內部可是封裝了很多很多的方法的。
而且是可以選擇引入包,如果你想用 hutool 的所有的 Jar 就可以引入所有的依賴:
- <dependency>
- <groupId>cn.hutool</groupId>
- <artifactId>hutool-all</artifactId>
- <version>5.5.2</version>
- </dependency>
如果說你只想用其中的某一項功能的時候,那么你就可以挑選其他的 Jar 依賴引入,比如:
- <dependency>
- <groupId>cn.hutool</groupId>
- <artifactId>hutool-core</artifactId>
- <version>5.6.5</version>
- </dependency>
我們就看看 hutool 都有哪些比較牛掰的 Jar 。
- hutool-aop JDK動態代理封裝,提供非IOC下的切面支持
- hutool-bloomFilter 布隆過濾,提供一些Hash算法的布隆過濾
- hutool-cache 簡單緩存實現
- hutool-core 核心,包括Bean操作、日期、各種Util等
- hutool-cron 定時任務模塊,提供類Crontab表達式的定時任務
- hutool-crypto 加密解密模塊,提供對稱、非對稱和摘要算法封裝
- hutool-db JDBC封裝后的數據操作,基于ActiveRecord思想
- hutool-extra 擴展模塊,對第三方封裝(模板引擎、郵件、Servlet、二維碼、Emoji、FTP、分詞等)
- hutool-http 基于HttpUrlConnection的Http客戶端封裝
- hutool-log 自動識別日志實現的日志門面
- hutool-setting 功能更強大的Setting配置文件和Properties封裝
- hutool-script 腳本執行封裝,例如Javascript
- hutool-system 系統參數調用封裝(JVM信息等)
- hutool-json JSON實現
- hutool-captcha 圖片驗證碼實現
- hutool-poi 針對POI中Excel和Word的封裝
- hutool-socket 基于Java的NIO和AIO的Socket封裝
我們挑幾個可以比較常用,而且比較放心的,相對于公司的系統來說,肯定很多人會說,這種 Jar 會不會不安全呢?畢竟互聯網時代,安全性要求是非常重要的,既然我們不用那些涉及到一些安全的用例的話,基礎的我們還是可以拿過來使用的,不是么?
比如說我們最經典的轉型,相信大家肯定使用過 HttpServletRequest ,也就是 HttpServletRequest 獲取的Parameter ,然后再轉型成我們所需要的類型就像下面:
- HttpServletRequest.getParameter("")
然后我們就得先轉換成 String ,然后再去轉換成我們想要的類型。
而在 Hutool 里面,就有一個類提供給我們使用,Convert 類。
轉換為字符串:
- 轉換為字符串:
- long[] b = {1,2,3,4,5};
- String bStr = Convert.toStr(b);
- System.out.println(bStr);
Convert.convert(Class, Object)方法可以將任意類型轉換為指定類型,Hutool中預定義了許多類型轉換,例如轉換為URI、URL、Calendar等等,這些類型的轉換都依托于ConverterRegistry類。
在源碼里面也是有注釋的,我們肯定去扒拉一下看看源碼不是么?
- /**
- * 轉換值為指定類型
- *
- * @param <T> 目標類型
- * @param type 類型
- * @param value 值
- * @return 轉換后的值
- * @since 4.0.0
- * @throws ConvertException 轉換器不存在
- */
- public static <T> T convert(Class<T> type, Object value) throws ConvertException{
- return convert((Type)type, value);
- }
- /**
- * 轉換值為指定類型
- *
- * @param <T> 目標類型
- * @param reference 類型參考,用于持有轉換后的泛型類型
- * @param value 值
- * @return 轉換后的值
- * @throws ConvertException 轉換器不存在
- */
- public static <T> T convert(TypeReference<T> reference, Object value) throws ConvertException{
- return convert(reference.getType(), value, null);
- }
不得不說,這玩意還真好用,而且你如果在百度上去搜索關于這方面的東西,有些時候還會發現,有人會把里面的源碼給拆出來,自己封裝成 Utils ,這種可能是覺得引入外面的 Jar 不是很靠譜,于是就把 Jar 里面的方法什么的都給重新封裝了一下,作為自己用。
上面這部分阿粉接了個圖,發現公司的某個項目中就是直接把 Conver 這個類直接拷貝了一份,然后當做了自己的類進行調用,不得不說,佩服!
提供的算法
Hutool 不光提供了一些基礎工具類的使用,同時還提供了一些算法,比如說:HashUtil
- additiveHash 加法hash
- public static int additiveHash(String key, int prime) {
- int hash, i;
- for (hash = key.length(), i = 0; i < key.length(); i++) {
- hash += key.charAt(i);
- }
- return hash % prime;
- }
- 旋轉hash
- public static int rotatingHash(String key, int prime) {
- int hash, i;
- for (hash = key.length(), i = 0; i < key.length(); ++i) {
- hash = (hash << 4) ^ (hash >> 28) ^ key.charAt(i);
- }
- // 使用:hash = (hash ^ (hash>>10) ^ (hash>>20)) & mask;
- // 替代:hash %= prime;
- // return (hash ^ (hash>>10) ^ (hash>>20));
- return hash % prime;
- }
- 一次一個hash
- public static int oneByOneHash(String key) {
- int hash, i;
- for (hash = 0, i = 0; i < key.length(); ++i) {
- hash += key.charAt(i);
- hash += (hash << 10);
- hash ^= (hash >> 6);
- }
- hash += (hash << 3);
- hash ^= (hash >> 11);
- hash += (hash << 15);
- // return (hash & M_MASK);
- return hash;
- }
工具類中融合了各種hash算法,不單單是這么幾種,還有好多,像:RS算法hash、JS算法、DEK算法、DJB算法。。。
總之,都是比較不錯的呀,至少比我們去百度上面搜索的這種靠譜呀。
而且還包括了加密解密,SecureUtil 其中有對稱加密-SymmetricCrypto,也有非對稱加密-AsymmetricCrypto。
非常多的內容值得大家去挖掘,如果想看官方文檔,阿粉也放給大家,大家可以去看看!
Hutool官方文檔(https://hutool.cn/docs/)
總結
作為一名開發人員,保證開發效率才是第一位的,善于使用工具,對你的開發進度是非常有幫助的,你學會了么?