<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          可別亂造輪子了,Spring自帶的工具類(lèi)嘎嘎好用

          共 11974字,需瀏覽 24分鐘

           ·

          2024-04-10 21:55

          大家新年好,我是小富~ 

          前言

          最近有些小伙伴,希望我分享一些好用的工具類(lèi),幫他們提升開(kāi)發(fā)效率。

          今天這篇文章專(zhuān)門(mén)跟大家一起總結(jié)一下,Spring框架本身自帶的一些好用的工具類(lèi),希望對(duì)你會(huì)有所幫助。

          e2dfb9c26edfc3a329f798370ab2a76f.webp

          1 Assert

          很多時(shí)候,我們需要在代碼中做判斷:如果不滿(mǎn)足條件,則拋異常。

          有沒(méi)有統(tǒng)一的封裝呢?

          其實(shí)Spring給我們提供了Assert類(lèi),它表示斷言。

          1.1 斷言參數(shù)是否為空

          斷言參數(shù)是否空,如果不滿(mǎn)足條件,則直接拋異常。

                
                String str = null;
          Assert.isNull(str, "str必須為空");
          Assert.isNull(str, () -> "str必須為空");
          Assert.notNull(str, "str不能為空");

          如果不滿(mǎn)足條件就會(huì)拋出IllegalArgumentException異常。

          1.2 斷言集合是否為空

          斷言集合是否空,如果不滿(mǎn)足條件,則直接拋異常。

                
                List<String> list = null;
          Map<String, String> map = null;
          Assert.notEmpty(list, "list不能為空");
          Assert.notEmpty(list, () -> "list不能為空");
          Assert.notEmpty(map, "map不能為空");

          如果不滿(mǎn)足條件就會(huì)拋出IllegalArgumentException異常。

          1.3 斷言條件是否為空

          斷言是否滿(mǎn)足某個(gè)條件,如果不滿(mǎn)足條件,則直接拋異常。

                
                List<String> list = null;
          Assert.isTrue(CollectionUtils.isNotEmpty(list), "list不能為空");
          Assert.isTrue(CollectionUtils.isNotEmpty(list), () -> "list不能為空");

          當(dāng)然Assert類(lèi)還有一些其他的功能,這里就不多介紹了。f68bfaafa43305808e28b2eafcf3e9e1.webp

          2 StringUtils

          在我們?nèi)粘i_(kāi)發(fā)過(guò)程中,對(duì)字符串的操作是非常頻繁的,但JDK提供的對(duì)于字符串操作的方法,過(guò)于簡(jiǎn)單,無(wú)法滿(mǎn)足我們開(kāi)發(fā)中的需求。

          其實(shí)Spring提供了工具類(lèi)StringUtils,對(duì)JDK中一些字符串的操作進(jìn)行了擴(kuò)展。

          2.1 判空

          StringUtils類(lèi)其實(shí)有個(gè)isEmpty()方法判斷,不過(guò)已經(jīng)被廢棄了。

          我們可以改成使用hasLength()方法判斷,例如:

                
                if (!StringUtils.hasLength("")) {
            System.out.println("字符串為空");
          }

          2.2 去掉空格

          對(duì)于后端的很多接口,經(jīng)常需要去掉前后空格,我們可以使用String類(lèi)的trim(),但是如果要同時(shí)去掉中間的空格呢?

          可以使用StringUtils類(lèi)的trimAllWhitespace方法。

          例如:

                
                @Test
          public void testEmpty() {
              System.out.println("1" + StringUtils.trimAllWhitespace(" 蘇三說(shuō)技術(shù) 測(cè)試 ") + "1");
          }

          這個(gè)方法執(zhí)行接口:1蘇三說(shuō)技術(shù)測(cè)試1,會(huì)把中間的空格也去掉了。

          2.3 判斷開(kāi)頭或結(jié)尾字符串

          要判斷一個(gè)字符串,是不是以某個(gè)固定字符串開(kāi)頭或者結(jié)尾,是非常常見(jiàn)的需求。

          我們可以使用StringUtils類(lèi)的startsWithIgnoreCase和endsWithIgnoreCase,可以忽略大小寫(xiě)比較字符串。

          例如:

                
                @Test
          public void testEmpty() {
              System.out.println(StringUtils.startsWithIgnoreCase("蘇三說(shuō)技術(shù)""蘇三"));
              System.out.println(StringUtils.endsWithIgnoreCase("蘇三說(shuō)技術(shù)""技術(shù)"));
          }

          該方法的執(zhí)行結(jié)果會(huì)返回兩個(gè)true。

          2.4 集合拼接字符串

          有時(shí)候我們需要將某個(gè)字符串集合的所有元素,拼接成一個(gè)字符串,用逗號(hào)隔開(kāi)。

          這種場(chǎng)景可以使用StringUtils類(lèi)的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));
          }

          該方法的執(zhí)行結(jié)果:a,b,c

          這個(gè)工具類(lèi)里面還有很多有用的方法:9a6a96ce9e4d5fa19d573e7b49d38535.webp

          3. CollectionUtils

          在我們?nèi)粘i_(kāi)發(fā)當(dāng)中,經(jīng)常會(huì)遇到集合,比如:list判空的情況。

          其實(shí)Spring專(zhuān)門(mén)為我們提供了,給集合判空的工具類(lèi):CollectionUtils,它位于org.springframework.util包下。c459b38584c3dddd0de77a66806e5352.webp

          對(duì)于一些簡(jiǎn)單的集合判斷,集合中是否包含某個(gè)元素,集合轉(zhuǎn)數(shù)組,用這個(gè)工具還是非常方便的。

          3.1 集合判空

          通過(guò)CollectionUtils工具類(lèi)的isEmpty方法可以輕松判斷集合是否為空。

          例如:

                
                List<Integer> list = new ArrayList<>();
          list.add(2);
          list.add(1);
          list.add(3);

          if (CollectionUtils.isEmpty(list)) {
              System.out.println("集合為空");
          }

          3.2 判斷元素是否存在

          通過(guò)CollectionUtils工具類(lèi)的contains方法,可以判斷元素在集合中是否存在。

          例如:

                
                List<Integer> list = new ArrayList<>();
          list.add(2);
          list.add(1);
          list.add(3);

          if (CollectionUtils.contains(list.iterator(), 3)) {
              System.out.println("元素存在");
          }

          在判斷時(shí)需要先調(diào)用集合的iterator()方法。

          4 ObjectUtils

          Spring為我們專(zhuān)門(mén)提供了一個(gè)對(duì)象操作工具:ObjectUtils,也在org.springframework.util包下。

          里面有很多非常有用的方法。

          4.1 判空

          之前已經(jīng)介紹過(guò)字符串判空工具類(lèi)StringUtils,和集合的判空工具類(lèi)CollectionUtils。

          而ObjectUtils工具的判空更強(qiáng)大,支持:對(duì)象、字符串、集合、數(shù)組、Optional、Map的判斷。

          例如:

                
                 @Test
          public void testEmpty() {
              String a = "123";
              Integer b = new Integer(1);
              List<String> c = new ArrayList<>();
              Integer[] d = new Integer[];
              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種對(duì)象的判空都支持,非常強(qiáng)大。

          4.2 判斷兩個(gè)對(duì)象相等

          之前我們用Objects.equals方法,判斷兩個(gè)對(duì)象是否相等,經(jīng)常會(huì)出現(xiàn)空指針問(wèn)題。

          而ObjectUtils類(lèi)提供了安全的判斷兩個(gè)對(duì)象相等的方法:nullSafeEquals。

          例如:

                
                @Test
          public void testEquals() {
              String a = "123";
              String b = null;
              System.out.println(ObjectUtils.nullSafeEquals(a, b));
          }

          這個(gè)例子返回的是false,不會(huì)出現(xiàn)空指針的問(wèn)題。

          甚至可以判斷兩個(gè)數(shù)組是否相等。

          例如:

                
                @Test
          public void testArrayEquals() {
              String[] a = new String[]{"123"};
              String[] b = new String[]{"123"};
              System.out.println(ObjectUtils.nullSafeEquals(a, b));
          }

          這個(gè)例子的執(zhí)行結(jié)果返回的是true。

          4.3 獲取對(duì)象的hashCode

          如果想要快速獲取某個(gè)對(duì)象十六進(jìn)制的hashCode,則可以調(diào)用getIdentityHexString方法。

          例如:

                
                @Test
          public void testIdentityHex() {
              String a = "123";
              System.out.println(ObjectUtils.getIdentityHexString(a));
          }

          執(zhí)行結(jié)果:2925bf5b

          5 ClassUtils

          Spring的org.springframework.util包下的ClassUtils類(lèi),它里面有很多讓我們驚喜的功能。

          它里面包含了類(lèi)和對(duì)象相關(guān)的很多非常實(shí)用的方法。

          5.1 獲取對(duì)象的所有接口

          如果你想獲取某個(gè)對(duì)象的所有接口,可以使用ClassUtils的getAllInterfaces方法。例如:

                
                Class<?>[] allInterfaces = ClassUtils.getAllInterfaces(new User());

          5.2 獲取某個(gè)類(lèi)的包名

          如果你想獲取某個(gè)類(lèi)的包名,可以使用ClassUtils的getPackageName方法。例如:

                
                String packageName = ClassUtils.getPackageName(User.class);
          System.out.println(packageName);

          5.3 判斷某個(gè)類(lèi)是否內(nèi)部類(lèi)

          如果你想判斷某個(gè)類(lèi)是否內(nèi)部類(lèi),可以使用ClassUtils的isInnerClass方法。例如:

                
                System.out.println(ClassUtils.isInnerClass(User.class));

          5.4 判斷對(duì)象是否代理對(duì)象

          如果你想判斷對(duì)象是否代理對(duì)象,可以使用ClassUtils的isCglibProxy方法。例如:

                
                System.out.println(ClassUtils.isCglibProxy(new User()));

          ClassUtils還有很多有用的方法,等待著你去發(fā)掘。感興趣的朋友,可以看看下面內(nèi)容:b3e7da13bbccac77fe28065e1763edd2.webp

          6 BeanUtils

          Spring給我們提供了一個(gè)JavaBean的工具類(lèi),它在org.springframework.beans包下面,它的名字叫做:BeanUtils。

          讓我們一起看看這個(gè)工具可以帶給我們哪些驚喜。

          6.1 拷貝對(duì)象的屬性

          曾幾何時(shí),你有沒(méi)有這樣的需求:把某個(gè)對(duì)象中的所有屬性,都拷貝到另外一個(gè)對(duì)象中。這時(shí)就能使用BeanUtils的copyProperties方法。例如:

                
                User user1 = new User();
          user1.setId(1L);
          user1.setName("蘇三說(shuō)技術(shù)");
          user1.setAddress("成都");

          User user2 = new User();
          BeanUtils.copyProperties(user1, user2);
          System.out.println(user2);

          6.2 實(shí)例化某個(gè)類(lèi)

          如果你想通過(guò)反射實(shí)例化一個(gè)類(lèi)的對(duì)象,可以使用BeanUtils的instantiateClass方法。例如:

                
                User user = BeanUtils.instantiateClass(User.class);
          System.out.println(user);

          6.3 獲取指定類(lèi)的指定方法

          如果你想獲取某個(gè)類(lèi)的指定方法,可以使用BeanUtils的findDeclaredMethod方法。例如:

                
                Method declaredMethod = BeanUtils.findDeclaredMethod(User.class, "getId");
          System.out.println(declaredMethod.getName());

          6.4 獲取指定方法的參數(shù)

          如果你想獲取某個(gè)方法的參數(shù),可以使用BeanUtils的findPropertyForMethod方法。例如:

                
                Method declaredMethod = BeanUtils.findDeclaredMethod(User.class, "getId");
          PropertyDescriptor propertyForMethod = BeanUtils.findPropertyForMethod(declaredMethod);
          System.out.println(propertyForMethod.getName());

          如果你對(duì)BeanUtils比較感興趣,可以看看下面內(nèi)容:35fc4f22189372472918aabd869ddb74.webp

          7 ReflectionUtils

          有時(shí)候,我們需要在項(xiàng)目中使用反射功能,如果使用最原始的方法來(lái)開(kāi)發(fā),代碼量會(huì)非常多,而且很麻煩,它需要處理一大堆異常以及訪(fǎng)問(wèn)權(quán)限等問(wèn)題。

          好消息是Spring給我們提供了一個(gè)ReflectionUtils工具,它在org.springframework.util包下面。

          7.1 獲取方法

          如果你想獲取某個(gè)類(lèi)的某個(gè)方法,可以使用ReflectionUtils類(lèi)的findMethod方法。例如:

                
                Method method = ReflectionUtils.findMethod(User.class, "getId");

          7.2 獲取字段

          如果你想獲取某個(gè)類(lèi)的某個(gè)字段,可以使用ReflectionUtils類(lèi)的findField方法。例如:

                
                Field field = ReflectionUtils.findField(User.class, "id");

          7.3 執(zhí)行方法

          如果你想通過(guò)反射調(diào)用某個(gè)方法,傳遞參數(shù),可以使用ReflectionUtils類(lèi)的invokeMethod方法。例如:

                
                ReflectionUtils.invokeMethod(method, springContextsUtil.getBean(beanName), param);

          7.4 判斷字段是否常量

          如果你想判斷某個(gè)字段是否常量,可以使用ReflectionUtils類(lèi)的isPublicStaticFinal方法。例如:

                
                Field field = ReflectionUtils.findField(User.class, "id");
          System.out.println(ReflectionUtils.isPublicStaticFinal(field));

          7.5 判斷是否equals方法

          如果你想判斷某個(gè)方法是否equals方法,可以使用ReflectionUtils類(lèi)的isEqualsMethod方法。例如:

                
                Method method = ReflectionUtils.findMethod(User.class, "getId");
          System.out.println(ReflectionUtils.isEqualsMethod(method));

          當(dāng)然這個(gè)類(lèi)還有不少有趣的方法,感興趣的朋友,可以看看下面內(nèi)容:9240e37f0f5b9f98fac735d3c37b413b.webp

          8 Base64Utils

          有時(shí)候,為了安全考慮,需要將參數(shù)只用base64編碼。

          這時(shí)就能直接使用org.springframework.util包下的Base64Utils工具類(lèi)。

          它里面包含:encodedecode方法,用于對(duì)數(shù)據(jù)進(jìn)行編碼解碼。

          例如:

                
                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();
          }

          執(zhí)行結(jié)果:

                
                編碼后:YWJj
          解碼后:abc

          9 SerializationUtils

          有時(shí)候,我們需要把數(shù)據(jù)進(jìn)行序列化和反序列化處理。

          傳統(tǒng)的做法是某個(gè)類(lèi)實(shí)現(xiàn)Serializable接口,然后重新它的writeObject和readObject方法。

          但如果使用org.springframework.util包下的SerializationUtils工具類(lèi),能更輕松實(shí)現(xiàn)序列化和反序列化功能。

          例如:

                
                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

          很多時(shí)候,我們會(huì)在代碼中定義http的返回碼,比如:接口正常返回200,異常返回500,接口找不到返回404,接口不可用返回502等。

                
                private int SUCCESS_CODE = 200;
          private int ERROR_CODE = 500;
          private int NOT_FOUND_CODE = 404;

          其實(shí)org.springframework.http包下的HttpStatus枚舉,或者org.apache.http包下的HttpStatus接口,已經(jīng)把常用的http返回碼給我們定義好了,直接拿來(lái)用就可以了,真的不用再重復(fù)定義了。4e9dbe0daced5ffd7595bae44c76220e.webp

          11 HtmlUtils

          有時(shí)候,用戶(hù)輸入的內(nèi)容中包含了一些特殊的標(biāo)簽,比如<,如果不錯(cuò)處理程序可能會(huì)報(bào)錯(cuò)。

          而且為了安全性,對(duì)用戶(hù)輸入的特色字符,也需要做轉(zhuǎn)義,防止一些SQL注入,或者XSS攻擊等。

          其實(shí)Spring給我們提供了一個(gè)專(zhuān)門(mén)處理html的工具:HtmlUtils,我們可以直接用它來(lái)做轉(zhuǎn)義,使用起來(lái)非常方便。

          例如:

                
                @Test
          public void testHtml() {
              String specialStr = "<div id=\"testDiv\">test1;test2</div>";
              String str1 = HtmlUtils.htmlEscape(specialStr);
              System.out.println(str1);
          }

          執(zhí)行結(jié)果:&lt;div id=&quot;testDiv&quot;&gt;test1;test2&lt;/div&

          我是小富,歡迎關(guān)注?,下期見(jiàn)~


          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色在线视频2021 | 日韩精品一区二区三区四区苍老师 | 国产成人精品无码区免费福利 | 国产综合内射日韩久 | 在线观看黄色网 |