別瞎寫工具類了,Spring自帶的不香嗎?
來源:蘇三說技術
前言
今天這篇文章專門跟大家一起總結一下,Spring框架本身自帶的一些好用的工具類,希望對你會有所幫助。
1 Assert
很多時候,我們需要在程式碼中做判斷:如果不滿足條件,則拋異常。
有沒有統一的封裝呢?
其實Spring給我們提供了Assert
類,它表示斷言。
1.1 斷言引數是否為空
斷言引數是否空,如果不滿足條件,則直接拋異常。
String str = null;
Assert.isNull(str, "str必須為空");
Assert.isNull(str, () -> "str必須為空");
Assert.notNull(str, "str不能為空");
如果不滿足條件就會丟擲IllegalArgumentException異常。
1.2 斷言集合是否為空
斷言集合是否空,如果不滿足條件,則直接拋異常。
List<String> list = null;
Map<String, String> map = null;
Assert.notEmpty(list, "list不能為空");
Assert.notEmpty(list, () -> "list不能為空");
Assert.notEmpty(map, "map不能為空");
如果不滿足條件就會丟擲IllegalArgumentException異常。
1.3 斷言條件是否為空
斷言是否滿足某個條件,如果不滿足條件,則直接拋異常。
List<String> list = null;
Assert.isTrue(CollectionUtils.isNotEmpty(list), "list不能為空");
Assert.isTrue(CollectionUtils.isNotEmpty(list), () -> "list不能為空");
當然Assert類還有一些其他的功能,這裡就不多介紹了。
2 StringUtils
在我們日常開發過程中,對字串的操作是非常頻繁的,但JDK提供的對於字串操作的方法,過於簡單,無法滿足我們開發中的需求。
其實Spring提供了工具類StringUtils,對JDK中一些字串的操作進行了擴充套件。
2.1 判空
StringUtils類其實有個isEmpty()方法判斷,不過已經被廢棄了。
我們可以改成使用hasLength()方法判斷,例如:
if (!StringUtils.hasLength("")) {
System.out.println("字串為空");
}
2.2 去掉空格
對於後端的很多介面,經常需要去掉前後空格,我們可以使用String類的trim(),但是如果要同時去掉中間的空格呢?
可以使用StringUtils類的trimAllWhitespace方法。
例如:
@Test
public void testEmpty() {
System.out.println("1" + StringUtils.trimAllWhitespace(" 蘇三說技術 測試 ") + "1");
}
這個方法執行介面:1蘇三說技術測試1,會把中間的空格也去掉了。
2.3 判斷開頭或結尾字串
要判斷一個字串,是不是以某個固定字串開頭或者結尾,是非常常見的需求。
我們可以使用StringUtils類的startsWithIgnoreCase和endsWithIgnoreCase,可以忽略大小寫比較字串。
例如:
@Test
public void testEmpty() {
System.out.println(StringUtils.startsWithIgnoreCase("蘇三說技術", "蘇三"));
System.out.println(StringUtils.endsWithIgnoreCase("蘇三說技術", "技術"));
}
該方法的執行結果會返回兩個true。
2.4 集合拼接字串
有時候我們需要將某個字串集合的所有元素,拼接成一個字串,用逗號隔開。
這種場景可以使用StringUtils類的collectionToCommaDelimitedString方法。
例如:
@Test
public void testEmpty() {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(StringUtils.collectionToCommaDelimitedString(list));
}
該方法的執行結果:a,b,c
這個工具類裡面還有很多有用的方法:
3. CollectionUtils
在我們日常開發當中,經常會遇到集合,比如:list判空的情況。
其實Spring專門為我們提供了,給集合判空的工具類:CollectionUtils
,它位於org.springframework.util包下。
對於一些簡單的集合判斷,集合中是否包含某個元素,集合轉陣列,用這個工具還是非常方便的。
3.1 集合判空
透過CollectionUtils工具類的isEmpty方法可以輕鬆判斷集合是否為空。
例如:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
if (CollectionUtils.isEmpty(list)) {
System.out.println("集合為空");
}
3.2 判斷元素是否存在
透過CollectionUtils工具類的contains方法,可以判斷元素在集合中是否存在。
例如:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
if (CollectionUtils.contains(list.iterator(), 3)) {
System.out.println("元素存在");
}
在判斷時需要先呼叫集合的iterator()方法。
4 ObjectUtils
Spring為我們專門提供了一個物件操作工具:ObjectUtils
,也在org.springframework.util包下。
裡面有很多非常有用的方法。
4.1 判空
之前已經介紹過字串判空工具類StringUtils,和集合的判空工具類CollectionUtils。
而ObjectUtils工具的判空更強大,支援:物件、字串、集合、陣列、Optional、Map的判斷。
例如:
@Test
public void testEmpty() {
String a = "123";
Integer b = new Integer(1);
List<String> c = new ArrayList<>();
Integer[] d = new Integer[]{b};
c.add(a);
Map<String, String> e = new HashMap<>();
e.put(a, a);
Optional<String> f = Optional.of(a);
if (!ObjectUtils.isEmpty(a)) {
System.out.println("a不為空");
}
if (!ObjectUtils.isEmpty(b)) {
System.out.println("b不為空");
}
if (!ObjectUtils.isEmpty(c)) {
System.out.println("c不為空");
}
if (!ObjectUtils.isEmpty(d)) {
System.out.println("d不為空");
}
if (!ObjectUtils.isEmpty(e)) {
System.out.println("e不為空");
}
if (!ObjectUtils.isEmpty(f)) {
System.out.println("f不為空");
}
}
這6種物件的判空都支援,非常強大。
4.2 判斷兩個物件相等
之前我們用Objects.equals方法,判斷兩個物件是否相等,經常會出現空指標問題。
而ObjectUtils類提供了安全的判斷兩個物件相等的方法:nullSafeEquals。
例如:
@Test
public void testEquals() {
String a = "123";
String b = null;
System.out.println(ObjectUtils.nullSafeEquals(a, b));
}
這個例子返回的是false,不會出現空指標的問題。
甚至可以判斷兩個陣列是否相等。
例如:
@Test
public void testArrayEquals() {
String[] a = new String[]{"123"};
String[] b = new String[]{"123"};
System.out.println(ObjectUtils.nullSafeEquals(a, b));
}
這個例子的執行結果返回的是true。
4.3 獲取物件的hashCode
如果想要快速獲取某個物件十六進位制的hashCode,則可以呼叫getIdentityHexString方法。
例如:
@Test
public void testIdentityHex() {
String a = "123";
System.out.println(ObjectUtils.getIdentityHexString(a));
}
執行結果:2925bf5b
5 ClassUtils
Spring的org.springframework.util包下的ClassUtils
類,它裡面有很多讓我們驚喜的功能。
它裡面包含了類和物件相關的很多非常實用的方法。
5.1 獲取物件的所有介面
如果你想獲取某個物件的所有介面,可以使用ClassUtils的getAllInterfaces方法。例如:
Class<?>[] allInterfaces = ClassUtils.getAllInterfaces(new User());
5.2 獲取某個類的包名
如果你想獲取某個類的包名,可以使用ClassUtils的getPackageName方法。例如:
String packageName = ClassUtils.getPackageName(User.class);
System.out.println(packageName);
5.3 判斷某個類是否內部類
如果你想判斷某個類是否內部類,可以使用ClassUtils的isInnerClass方法。例如:
System.out.println(ClassUtils.isInnerClass(User.class));
5.4 判斷物件是否代理物件
如果你想判斷物件是否代理物件,可以使用ClassUtils的isCglibProxy方法。例如:
System.out.println(ClassUtils.isCglibProxy(new User()));
ClassUtils還有很多有用的方法,等待著你去發掘。感興趣的朋友,可以看看下面內容:
6 BeanUtils
Spring給我們提供了一個JavaBean的工具類,它在org.springframework.beans包下面,它的名字叫做:BeanUtils
。
讓我們一起看看這個工具可以帶給我們哪些驚喜。
6.1 複製物件的屬性
曾幾何時,你有沒有這樣的需求:把某個物件中的所有屬性,都複製到另外一個物件中。這時就能使用BeanUtils的copyProperties方法。例如:
User user1 = new User();
user1.setId(1L);
user1.setName("蘇三說技術");
user1.setAddress("成都");
User user2 = new User();
BeanUtils.copyProperties(user1, user2);
System.out.println(user2);
6.2 例項化某個類
如果你想透過反射例項化一個類的物件,可以使用BeanUtils的instantiateClass方法。例如:
User user = BeanUtils.instantiateClass(User.class);
System.out.println(user);
6.3 獲取指定類的指定方法
如果你想獲取某個類的指定方法,可以使用BeanUtils的findDeclaredMethod方法。例如:
Method declaredMethod = BeanUtils.findDeclaredMethod(User.class, "getId");
System.out.println(declaredMethod.getName());
6.4 獲取指定方法的引數
如果你想獲取某個方法的引數,可以使用BeanUtils的findPropertyForMethod方法。例如:
Method declaredMethod = BeanUtils.findDeclaredMethod(User.class, "getId");
PropertyDescriptor propertyForMethod = BeanUtils.findPropertyForMethod(declaredMethod);
System.out.println(propertyForMethod.getName());
如果你對BeanUtils比較感興趣,可以看看下面內容:
7 ReflectionUtils
有時候,我們需要在專案中使用反射功能,如果使用最原始的方法來開發,程式碼量會非常多,而且很麻煩,它需要處理一大堆異常以及訪問許可權等問題。
好訊息是Spring給我們提供了一個ReflectionUtils
工具,它在org.springframework.util包下面。
7.1 獲取方法
如果你想獲取某個類的某個方法,可以使用ReflectionUtils類的findMethod方法。例如:
Method method = ReflectionUtils.findMethod(User.class, "getId");
7.2 獲取欄位
如果你想獲取某個類的某個欄位,可以使用ReflectionUtils類的findField方法。例如:
Field field = ReflectionUtils.findField(User.class, "id");
7.3 執行方法
如果你想透過反射呼叫某個方法,傳遞引數,可以使用ReflectionUtils類的invokeMethod方法。例如:
ReflectionUtils.invokeMethod(method, springContextsUtil.getBean(beanName), param);
7.4 判斷欄位是否常量
如果你想判斷某個欄位是否常量,可以使用ReflectionUtils類的isPublicStaticFinal方法。例如:
Field field = ReflectionUtils.findField(User.class, "id");
System.out.println(ReflectionUtils.isPublicStaticFinal(field));
7.5 判斷是否equals方法
如果你想判斷某個方法是否equals方法,可以使用ReflectionUtils類的isEqualsMethod方法。例如:
Method method = ReflectionUtils.findMethod(User.class, "getId");
System.out.println(ReflectionUtils.isEqualsMethod(method));
當然這個類還有不少有趣的方法,感興趣的朋友,可以看看下面內容:
8 Base64Utils
有時候,為了安全考慮,需要將引數只用base64編碼。
這時就能直接使用org.springframework.util包下的Base64Utils
工具類。
它裡面包含:encode
和decode
方法,用於對資料進行編碼
和解碼
。
例如:
String str = "abc";
String encode = new String(Base64Utils.encode(str.getBytes()));
System.out.println("編碼後:" + encode);
try {
String decode = new String(Base64Utils.decode(encode.getBytes()), "utf8");
System.out.println("解碼:" + decode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
執行結果:
編碼後:YWJj
解碼後:abc
9 SerializationUtils
有時候,我們需要把資料進行序列化和反序列化處理。
傳統的做法是某個類實現Serializable介面,然後重新它的writeObject和readObject方法。
但如果使用org.springframework.util包下的SerializationUtils
工具類,能更輕鬆實現序列化和反序列化功能。
例如:
Map<String, String> map = Maps.newHashMap();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
byte[] serialize = SerializationUtils.serialize(map);
Object deserialize = SerializationUtils.deserialize(serialize);
System.out.println(deserialize);
10 HttpStatus
很多時候,我們會在程式碼中定義http的返回碼,比如:介面正常返回200,異常返回500,介面找不到返回404,介面不可用返回502等。
private int SUCCESS_CODE = 200;
private int ERROR_CODE = 500;
private int NOT_FOUND_CODE = 404;
其實org.springframework.http包下的HttpStatus
列舉,或者org.apache.http包下的HttpStatus介面,已經把常用的http返回碼給我們定義好了,直接拿來用就可以了,真的不用再重複定義了。
11 HtmlUtils
有時候,使用者輸入的內容中包含了一些特殊的標籤,比如<,如果不錯處理程式可能會報錯。
而且為了安全性,對使用者輸入的特色字元,也需要做轉義,防止一些SQL隱碼攻擊,或者XSS攻擊等。
其實Spring給我們提供了一個專門處理html的工具:HtmlUtils,我們可以直接用它來做轉義,使用起來非常方便。
例如:
@Test
public void testHtml() {
String specialStr = "<div id=\"testDiv\">test1;test2</div>";
String str1 = HtmlUtils.htmlEscape(specialStr);
System.out.println(str1);
}
執行結果:<div id="testDiv">test1;test2</div>
;
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024924/viewspace-3006079/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 別再這麼寫程式碼了,這幾個方法不香嗎?
- 騰訊獨代不香了嗎?
- 不推薦別的了,IDEA 自帶的資料庫工具就很牛逼!Idea資料庫
- 懶得寫文件,swagger文件匯出來不香嗎Swagger
- 瞎寫寫
- 2020年了,IT外企還香嗎?
- python定義類不寫括號嗎Python
- ES 不香嗎,為啥還要 ClickHouse?
- SDRAM 不帶自動預充電寫操作
- Spring Boot + liteflow 規則引擎,太香了!Spring Boot
- 別再面向 for 迴圈程式設計了,Spring 自帶的觀察者模式就很香!程式設計Spring模式
- 自研自發不稀奇,CP要搶發行的飯碗了嗎?
- Spring統一返回Json工具類,帶分頁資訊SpringJSON
- win10圖片檢視器沒有了 win10自帶看圖工具不見了Win10
- 人人都愛Kubernetes,Docker難道就不香了嗎?Docker
- Spring 快取註解這樣用,太香了!Spring快取
- 谷歌雲遊戲來了?抱歉,香不起來谷歌遊戲
- 【瞎寫】熊是什麼顏色的?
- 用來寫爆文的自媒體工具,你有在用嗎?
- php 自帶datetime類的使用PHP
- 自從學會了VBA字典,VLOOKUP都不那麼香了
- 大廠大批招聘C/C++工程師,掌握了C/C++的程式設計師他不香嗎!C++工程師程式設計師
- Shell--引用變數帶不帶""的區別變數
- JDK中自帶的JVM分析工具JDKJVM
- Spring MVC 過時了嗎?SpringMVC
- 《今天面試了嗎》-Spring面試Spring
- 變數宣告帶var與不帶var的區別變數
- 別人寫的CSS,你敢用嗎?CSS
- 用費曼技巧學程式設計,香不香?程式設計
- win10自帶畫圖工具在哪裡 電腦自帶的畫圖工具使用教程Win10
- java ftp工具類,帶你領略5款不同的java ftp工具類JavaFTP
- 反射獲取注入到spring中的類物件的工具類反射Spring物件
- 【瞎寫程式碼】系列之redux表面理解Redux
- java工具類編寫思考Java
- win10如何使用自帶遷移工具 win10使用自帶遷移工具的方法Win10
- 日本樂天製藥:研究發現年輕女性自帶體香
- Xcode自帶的超好用的診斷工具XCode
- 一行就夠了!帶你寫出語不驚人誓不休的lambda...