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
















 
 














 