一個(gè)非常好用的Jar,可以幫你省去整合Utils的時(shí)間
本文轉(zhuǎn)載自微信公眾號(hào)「Java極客技術(shù)」,作者鴨血粉絲。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java極客技術(shù)公眾號(hào)。
前段時(shí)間,阿粉在公司做功能的時(shí)候,出現(xiàn)了一個(gè)比較別致的需求,需要在頁(yè)面上顯示辛丑年x月x日,于是阿粉就在想,這個(gè)天干地支這玩意是不是有人做過(guò)封裝,能不能整合到Utils里面,以后都一起使用吧,于是就在 Google 上開始搜索有關(guān)的內(nèi)容,結(jié)果不搜不知道,一搜嚇一跳,直接出現(xiàn)了一個(gè)完整的封裝好的 Jar 可以直接使用,于是阿粉就把這個(gè) Jar 包的依賴加入到了自己的項(xiàng)目中,而且去源碼中扒拉了一下,感覺里面東西真心不錯(cuò),于是決定分享給大家一下。
Hutool
一個(gè)封裝了很多功能的 Jar ,阿粉要不是因?yàn)樾枨?,估?jì)可能很久不都不一定知道他,我們先來(lái)看看阿粉的需求是什么樣子的。
阿粉之前的需求是讓在后端返回一個(gè)所謂農(nóng)歷的干支紀(jì)年,而這個(gè)東西就不是那么容易了呀,要自己去找一些Utils的話,大家可以看一下。
需要我們?nèi)iT弄這個(gè)么Utils,然后去計(jì)算干支紀(jì)年,這是不是有點(diǎn)麻煩了,而我們的 Hutool 這個(gè) Jar 就非常的簡(jiǎn)單了,
- 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)為這個(gè) Jar 只能給你提供這一種幫助那就大錯(cuò)特錯(cuò)了,他內(nèi)部可是封裝了很多很多的方法的。
而且是可以選擇引入包,如果你想用 hutool 的所有的 Jar 就可以引入所有的依賴:
- <dependency>
- <groupId>cn.hutool</groupId>
- <artifactId>hutool-all</artifactId>
- <version>5.5.2</version>
- </dependency>
如果說(shuō)你只想用其中的某一項(xiàng)功能的時(shí)候,那么你就可以挑選其他的 Jar 依賴引入,比如:
- <dependency>
- <groupId>cn.hutool</groupId>
- <artifactId>hutool-core</artifactId>
- <version>5.6.5</version>
- </dependency>
我們就看看 hutool 都有哪些比較牛掰的 Jar 。
- hutool-aop JDK動(dòng)態(tài)代理封裝,提供非IOC下的切面支持
- hutool-bloomFilter 布隆過(guò)濾,提供一些Hash算法的布隆過(guò)濾
- hutool-cache 簡(jiǎn)單緩存實(shí)現(xiàn)
- hutool-core 核心,包括Bean操作、日期、各種Util等
- hutool-cron 定時(shí)任務(wù)模塊,提供類Crontab表達(dá)式的定時(shí)任務(wù)
- hutool-crypto 加密解密模塊,提供對(duì)稱、非對(duì)稱和摘要算法封裝
- hutool-db JDBC封裝后的數(shù)據(jù)操作,基于ActiveRecord思想
- hutool-extra 擴(kuò)展模塊,對(duì)第三方封裝(模板引擎、郵件、Servlet、二維碼、Emoji、FTP、分詞等)
- hutool-http 基于HttpUrlConnection的Http客戶端封裝
- hutool-log 自動(dòng)識(shí)別日志實(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 針對(duì)POI中Excel和Word的封裝
- hutool-socket 基于Java的NIO和AIO的Socket封裝
我們挑幾個(gè)可以比較常用,而且比較放心的,相對(duì)于公司的系統(tǒng)來(lái)說(shuō),肯定很多人會(huì)說(shuō),這種 Jar 會(huì)不會(huì)不安全呢?畢竟互聯(lián)網(wǎng)時(shí)代,安全性要求是非常重要的,既然我們不用那些涉及到一些安全的用例的話,基礎(chǔ)的我們還是可以拿過(guò)來(lái)使用的,不是么?
比如說(shuō)我們最經(jīng)典的轉(zhuǎn)型,相信大家肯定使用過(guò) HttpServletRequest ,也就是 HttpServletRequest 獲取的Parameter ,然后再轉(zhuǎn)型成我們所需要的類型就像下面:
- HttpServletRequest.getParameter("")
然后我們就得先轉(zhuǎn)換成 String ,然后再去轉(zhuǎn)換成我們想要的類型。
而在 Hutool 里面,就有一個(gè)類提供給我們使用,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);
- }
不得不說(shuō),這玩意還真好用,而且你如果在百度上去搜索關(guān)于這方面的東西,有些時(shí)候還會(huì)發(fā)現(xiàn),有人會(huì)把里面的源碼給拆出來(lái),自己封裝成 Utils ,這種可能是覺得引入外面的 Jar 不是很靠譜,于是就把 Jar 里面的方法什么的都給重新封裝了一下,作為自己用。
上面這部分阿粉接了個(gè)圖,發(fā)現(xiàn)公司的某個(gè)項(xiàng)目中就是直接把 Conver 這個(gè)類直接拷貝了一份,然后當(dāng)做了自己的類進(jìn)行調(diào)用,不得不說(shuō),佩服!
提供的算法
Hutool 不光提供了一些基礎(chǔ)工具類的使用,同時(shí)還提供了一些算法,比如說(shuō):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;
- }
- 一次一個(gè)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算法。。。
總之,都是比較不錯(cuò)的呀,至少比我們?nèi)グ俣壬厦嫠阉鞯倪@種靠譜呀。
而且還包括了加密解密,SecureUtil 其中有對(duì)稱加密-SymmetricCrypto,也有非對(duì)稱加密-AsymmetricCrypto。
非常多的內(nèi)容值得大家去挖掘,如果想看官方文檔,阿粉也放給大家,大家可以去看看!
Hutool官方文檔(https://hutool.cn/docs/)
總結(jié)
作為一名開發(fā)人員,保證開發(fā)效率才是第一位的,善于使用工具,對(duì)你的開發(fā)進(jìn)度是非常有幫助的,你學(xué)會(huì)了么?