源码分析六(org.springframework.util包之Assert类)

一:抽象类Assert

抽象类不能够实例化对象,但是可以被继承,Assert类是功能类,所以方法都是static修饰

所以可以直接  类名.方法 调用。

1

public abstract class Assert

 

构造方法:

抽象类中的构造方法的意义,其实不是很大,因为它不能实例化对象,所以不会调用,但是

如果有类继承Assert类,那么就会在子类中调用父类的构造方法,如果父类中构造方法时自定义

的有参构造,那么在子类构造方法中就要显示的调用,如果是无参构造,那么不用再子类中显示的

调用,默认就会调用父类的无参构造方法。

1

2

3

public Assert()

   {

   }

 

重载了两个isTrue方法,判断表达式是否是true,这种重载的方式构造代码很好,使用

比较灵活

1

2

3

4

5

6

7

8

9

10

11

12

public static void isTrue(boolean expression, String message)

    {<br>     //如果表达式的值为false,那么会抛出非法参数异常,如果是true,则结束方法的调用,return

        if(!expression)

            throw new IllegalArgumentException(message);

        else

            return;

    }

  //客户端程序员在使用的使用,可以直接调这个方法,如果想自定义异常信息,可以调用上面那个

    public static void isTrue(boolean expression)

    {

        isTrue(expression, "[Assertion failed] - this expression must be true");

    }

 

重载两个isNull的方法,判断对象object是否为null

1

2

3

4

5

6

7

8

9

10

11

12

public static void isNull(Object object, String message)

    {  <br>     //如果object不为null,则抛参数异常,为null则结束调用

        if(object != null)

            throw new IllegalArgumentException(message);

        else

            return;

    }

  判断object为null,如果想要自定义异常message,则可以调用上面那个方法

    public static void isNull(Object object)

    {

        isNull(object, "[Assertion failed] - the object argument must be null");

    }

 

重载两个notNull方法,判断object是否非null

1

2

3

4

5

6

7

8

9

10

11

12

public static void notNull(Object object, String message)

   {<br>     //如果object为null,则抛非法参数异常,否则结束方法调用,return

       if(object == null)

           throw new IllegalArgumentException(message);

       else

           return;

   }

 //如果需要自己定义抛出异常message,需要调用上面的方法

   public static void notNull(Object object)

   {

       notNull(object, "[Assertion failed] - this argument is required; it must not be null");

   }

 

判断字符串text是否有长度,就是是否为空(包括null或者"")

1

2

3

4

5

6

7

8

9

10

11

12

public static void hasLength(String text, String message)

    {<br>     //如果为空,则抛非法参数异常,否则直接结束方法的调用,return

        if(!StringUtils.hasLength(text))

            throw new IllegalArgumentException(message);

        else

            return;

    }

  //一般可以使用该方法直接判断text是否为空,如果需要自定义异常message信息,可以调用上面的方法

    public static void hasLength(String text)

    {

        hasLength(text, "[Assertion failed] - this String argument must have length; it must not be null or empty");

    }

1

StringUtils.hasLength(text)<br>这里引入了相同包向的StringUtils类的hasLength方法

1

2

3

4

5

6

7

8

9

public static boolean hasLength(CharSequence str)

    {<br>     //判断是否有长度,就是判断是否为null或者""

        return str != null && str.length() > 0;

    }

  //入参为String,调用重载方法,入参为字符序列,字符序列是接口,String类以及StringBuilder以及StringBuffer的父类

    public static boolean hasLength(String str)

    {

        return hasLength(((CharSequence) (str)));

    }

  

重载两个方法hasText,判断字符串是否有内容,就是判断字符串text不会null或者"",或者空白,例如:"   "

1

2

3

4

5

6

7

8

9

10

11

12

public static void hasText(String text, String message)

   {<br>     //为空(包括空白"  "),则抛参数非法异常,否则结束方法调用

       if(!StringUtils.hasText(text))

           throw new IllegalArgumentException(message);

       else

           return;

   }

 /如果为了自定义异常描述,可以调用上面的方法

   public static void hasText(String text)

   {

       hasText(text, "[Assertion failed] - this String argument must have text; it must not be null, empty, or blank");

   }

1

StringUtils.hasText(text)这里引入了StringUtils类下的hasText方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public static boolean hasText(CharSequence str)

   {<br>     //如果为null或者"",则直接返回false,没有内容

       if(!hasLength(str))

           return false;

       int strLen = str.length();<br>     //遍历字符串,得到每一个字符,如果有一个字符不是空白,就证明有内容,返回true,否则(所以都是空白),则返回false

       for(int i = 0; i < strLen; i++)<br>          

           if(!Character.isWhitespace(str.charAt(i)))

               return true;

 

       return false;

   }

 //重载入参为字符串String的方法

   public static boolean hasText(String str)

   {

       return hasText(((CharSequence) (str)));

   }

  

判断字符串textToSearch中不包含substring子串

1

2

3

4

5

6

7

8

9

10

11

12

public static void doesNotContain(String textToSearch, String substring, String message)

   {<br>     //如果字符串textToSearch以及subString都不为空,并且textToSearch包含子串substring,则抛出异常,否则return结束方法调用

       if(StringUtils.hasLength(textToSearch) && StringUtils.hasLength(substring) && textToSearch.contains(substring))

           throw new IllegalArgumentException(message);

       else

           return;

   }

 //如果需要自定义异常信息message,则可以直接调用上面的方法

   public static void doesNotContain(String textToSearch, String substring)

   {

       doesNotContain(textToSearch, substring, (new StringBuilder()).append("[Assertion failed] - this String argument must not contain the substring [").append(substring).append("]").toString());

   }

这里有

1

textToSearch.contains(substring) 方法:来自于String类的方法contains()

1

2

3

public boolean contains(CharSequence s) {

      return indexOf(s.toString()) > -1;

  }

包含调用indexOf则返回索引,不包含则返回-1

 

判断数组array是否非空

1

2

3

4

5

6

7

8

9

10

11

12

public static void notEmpty(Object array[], String message)

   {  <br>     //如果数组array为空,则抛参数非法异常,否则结束方法的调用

       if(ObjectUtils.isEmpty(array))

           throw new IllegalArgumentException(message);

       else

           return;

   }

 //自定义异常信息,则调用上面重载的方法更加灵活

   public static void notEmpty(Object array[])

   {

       notEmpty(array, "[Assertion failed] - this array must not be empty: it must contain at least 1 element");

   }

这里调用

1

ObjectUtils.isEmpty(array)方法:

1

2

3

4

public static boolean isEmpty(Object array[])

    {<br>     //如果数组array为null或者长度length为0则为空

        return array == null || array.length == 0;

    }

 

判断数组array没有null元素

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public static void noNullElements(Object array[], String message)

   {<br>     //如果array非null,则取出array数组中的每一个元素和null进行比较,如果有一个为null则抛出异常

       if(array != null)

       {

           Object arr$[] = array; //这里面有个地址复制的动作,将array数组对象的地址给了arr,这样在栈中就有两个地址指向array数组对象

           int len$ = arr$.length;

           for(int i$ = 0; i$ < len$; i$++)

           {

               Object element = arr$[i$];

               if(element == null)

                   throw new IllegalArgumentException(message);

           }

 

       }

   }

 

   public static void noNullElements(Object array[])

   {

       noNullElements(array, "[Assertion failed] - this array must not contain any null elements");

   }

 

对于集合Collection的非空判断

1

2

3

4

5

6

7

8

9

10

11

12

public static void notEmpty(Collection collection, String message)

    {<br>        //如果collection集合为空,则抛出参数非法异常,否则结束方法调用,直接return

        if(CollectionUtils.isEmpty(collection))

            throw new IllegalArgumentException(message);

        else

            return;

    }

 

    public static void notEmpty(Collection collection)

    {

        notEmpty(collection, "[Assertion failed] - this collection must not be empty: it must contain at least 1 element");

    }

1

CollectionUtils.isEmpty(collection)

1

2

3

4

public static boolean isEmpty(Collection collection)

   {<br>     //集合为null或没有元素

       return collection == null || collection.isEmpty();

   }

 

判断集合map非空,如果为空,则抛异常

1

2

3

4

5

6

7

8

9

10

11

12

public static void notEmpty(Map map, String message)

    {

        if(CollectionUtils.isEmpty(map))

            throw new IllegalArgumentException(message);

        else

            return;

    }

 

    public static void notEmpty(Map map)

    {

        notEmpty(map, "[Assertion failed] - this map must not be empty; it must contain at least one entry");

    }

  

1

CollectionUtils.isEmpty(map)

1

2

3

4

public static boolean isEmpty(Map map)

   {

       return map == null || map.isEmpty();

   }

  

判断obj对象是否是clazz类的实例

1

2

3

4

5

6

7

8

9

10

11

12

13

public static void isInstanceOf(Class clazz, Object obj)

   {

       isInstanceOf(clazz, obj, "");

   }

 

   public static void isInstanceOf(Class type, Object obj, String message)

   {<br>     //如果obj不是type的实例,则抛出异常

       notNull(type, "Type to check against must not be null");

       if(!type.isInstance(obj))

           throw new IllegalArgumentException((new StringBuilder()).append(StringUtils.hasLength(message) ? (new StringBuilder()).append(message).append(" ").toString() : "").append("Object of class [").append(obj == null "null" : obj.getClass().getName()).append("] must be an instance of ").append(type).toString());

       else

           return;

   }

isInstanceOf方法用法类似与运算符instanceof

 

判断superType等于subType或者是subType的父类

1

2

3

4

5

6

7

8

9

10

11

12

13

public static void isAssignable(Class superType, Class subType)

   {

       isAssignable(superType, subType, "");

   }

 

   public static void isAssignable(Class superType, Class subType, String message)

   {

       notNull(superType, "Type to check against must not be null");<br>     //如果subType为null或者superType不是subType的父类或者相同,那么抛出异常

       if(subType == null || !superType.isAssignableFrom(subType))

           throw new IllegalArgumentException((new StringBuilder()).append(message).append(subType).append(" is not assignable to ").append(superType).toString());

       else

           return;

   }

  

重载两个方法state,用途类似与之前的isTrue方法

1

2

3

4

5

6

7

8

9

10

11

12

public static void state(boolean expression, String message)

    {

        if(!expression)

            throw new IllegalStateException(message);

        else

            return;

    }

 

    public static void state(boolean expression)

    {

        state(expression, "[Assertion failed] - this state invariant must be true");

    }

  

二:总结

spring框架是优秀的第三方框架,代码的设计架构比较良好,仔细研究学习,对自己的编程会有很多的帮助,spring的代码中

很多创建重载的方法,这样使用起来更加灵活,可以更加业务场景,自定义异常信息,今天就写到这里,后续再继续整理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对这个问题,你需要做以下几步来解决: 1. 首先,你需要检查你的应用程序中是否存在多个版本的org.springframework.util.Assert。你可以使用以下命令来检查: ```shell mvn dependency:tree -Dverbose -Dincludes=org.springframework.util.Assert ``` 这将列出所有依赖项,以及它们所依赖的任何其他依赖项。你需要查找重复的依赖项并删除它们。 2. 如果你无法删除重复的依赖项,你可以尝试将它们排除在构建之外。你可以在pom.xml文件中添加以下代码来实现: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.0.RELEASE</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-jcl</artifactId> </exclusion> </exclusions> </dependency> ``` 这将排除spring-core依赖项中的spring-jcl依赖项。 3. 如果你仍然无法解决问题,你可以尝试使用Maven Enforcer插件来强制执行依赖项版本。你可以在pom.xml文件中添加以下代码来实现: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>1.4.1</version> <executions> <execution> <id>enforce</id> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <dependencyConvergence/> </rules> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 这将强制执行依赖项收敛规则,以确保所有依赖项都使用相同的版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值