一:抽象类Assert

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

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

public abstract class Assert

构造方法:

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

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

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

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

 public Assert()
{
}

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

比较灵活

public static void isTrue(boolean expression, String message)
{
     //如果表达式的值为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

public static void isNull(Object object, String message)
{  
     //如果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

 public static void notNull(Object object, String message)
{
     //如果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或者"")

public static void hasLength(String text, String message)
{
     //如果为空,则抛非法参数异常,否则直接结束方法的调用,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");
}
StringUtils.hasLength(text)
这里引入了相同包向的StringUtils类的hasLength方法
public static boolean hasLength(CharSequence str)
{
     //判断是否有长度,就是判断是否为null或者""
return str != null && str.length() > 0;
}
  //入参为String,调用重载方法,入参为字符序列,字符序列是接口,String类以及StringBuilder以及StringBuffer的父类
public static boolean hasLength(String str)
{
return hasLength(((CharSequence) (str)));
}

  

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

 public static void hasText(String text, String message)
{
     //为空(包括空白" "),则抛参数非法异常,否则结束方法调用
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");
}
StringUtils.hasText(text)这里引入了StringUtils类下的hasText方法
 public static boolean hasText(CharSequence str)
{
     //如果为null或者"",则直接返回false,没有内容
if(!hasLength(str))
return false;
int strLen = str.length();
     //遍历字符串,得到每一个字符,如果有一个字符不是空白,就证明有内容,返回true,否则(所以都是空白),则返回false
for(int i = 0; i < strLen; i++)
          
if(!Character.isWhitespace(str.charAt(i)))
return true; return false;
}
  //重载入参为字符串String的方法
public static boolean hasText(String str)
{
return hasText(((CharSequence) (str)));
}

  

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

 public static void doesNotContain(String textToSearch, String substring, String message)
{
     //如果字符串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());
}

这里有

textToSearch.contains(substring) 方法:来自于String类的方法contains()
  public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}

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

判断数组array是否非空

 public static void notEmpty(Object array[], String message)
{  
     //如果数组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");
}

这里调用

ObjectUtils.isEmpty(array)方法:
public static boolean isEmpty(Object array[])
{
     //如果数组array为null或者长度length为0则为空
return array == null || array.length == 0;
}

 

判断数组array没有null元素

 public static void noNullElements(Object array[], String message)
{
     //如果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的非空判断

public static void notEmpty(Collection collection, String message)
{
//如果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");
}
CollectionUtils.isEmpty(collection)
 public static boolean isEmpty(Collection collection)
{
     //集合为null或没有元素
return collection == null || collection.isEmpty();
}

 

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

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

  

CollectionUtils.isEmpty(map)
 public static boolean isEmpty(Map map)
{
return map == null || map.isEmpty();
}

  

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

 public static void isInstanceOf(Class clazz, Object obj)
{
isInstanceOf(clazz, obj, "");
}
  
public static void isInstanceOf(Class type, Object obj, String message)
{
     //如果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的父类

 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");
     //如果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方法

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的代码中

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

源码分析六(org.springframework.util包之Assert类)的更多相关文章

  1. 源码分析八(org.springframework.util包之StringUtils类))

    一:spring框架util包中的StringUtils类主要是处理关于字符串 的功能方法,下面直接结合代码分析: //判断字符串是否为空,如果为nul或者""则返回true,否则 ...

  2. 一点一点看JDK源码(六)java.util.LinkedList前篇之链表概要

    一点一点看JDK源码(六)java.util.LinkedList前篇之链表概要 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.什么 ...

  3. motan源码分析六:客户端与服务器的通信层分析

    本章将分析motan的序列化和底层通信相关部分的代码. 1.在上一章中,有一个getrefers的操作,来获取所有服务器的引用,每个服务器的引用都是由DefaultRpcReferer来创建的 pub ...

  4. ABP源码分析六:依赖注入的实现

    ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架.2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入 ...

  5. Duilib源码分析(六)整体流程

    在<Duilib源码分析(一)整体框架>.<Duilib源码分析(二)控件构造器—CDialogBuilder>以及<Duilib源码分析(三)XML解析器—CMarku ...

  6. Vue.js 源码分析(六) 基础篇 计算属性 computed 属性详解

    模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护,比如: <div id="example">{{ messag ...

  7. vuex 源码分析(六) 辅助函数 详解

    对于state.getter.mutation.action来说,如果每次使用的时候都用this.$store.state.this.$store.getter等引用,会比较麻烦,代码也重复和冗余,我 ...

  8. dubbo源码分析2——SPI机制中的SPI实现类的读取和预处理

    SPI机制中的SPI实现类的读取和预处理是由ExtensionLoader类的loadFile方法来完成的 loadFile方法的作用是读取dubbo的某个SPI接口的spi描述文件,然后进行缓存,缓 ...

  9. Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?

    阅前提醒 全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解.由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位 ...

随机推荐

  1. netable 禁用拖动

    nestable在点击的时候,有一个拖动的状态被触发,会导致你给nestable上加的链接都会无效. 只要在最外层的li里加入一个class为:dd-nodrag,就不会被触发了.然后你在子菜单中就可 ...

  2. Spring Cloud Config 服务端与 客户端之间的关系

    1.服务端有两个可配置项 # 是否在服务器端进行解密操作,默认开启. # 如果改为不在服务器端开启(false) # 那么一定要将encrypt.key 删除. # 否则会出现客户端无法解密. # 为 ...

  3. 开始一段新的敏捷学习之旅 —— IT帮读书会第4期《Scrum实战》

    刚看了一下,距离上一次写博客过去快1年半了.之前的知识管理都放到笔记软件中了,但是现在看来,收藏了很多东西,输入很多,但是输出有限. 学习任何领域的知识,如果只有输入没有输出,效果都是很有限的,有时需 ...

  4. JS函数重载解决方案

    JS的函数定义可以指定形式参数名称,多多少少我们会以为js至少可以支持参数个数不同的方法重载,然而遗憾的是这仅仅是一个假象,js所有的参数都是以arguments传递过去的,这个参数类似于数组,在函数 ...

  5. 【转】web前端到底怎么学?干货资料!

    一般据我经验,在喜欢并且决定和她恋爱之前,我都会做一下充分准备和调查,有必要了解和研究清楚 ‘她’ 的几个特性和习惯 web前端的基本工作职责 和基础技能(要清楚) web前端的分类和门派(简要概述, ...

  6. [maven] settings 文件 本地maven仓库

    <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...

  7. Ubuntu 16.04 标题栏实时显示上下行网速、CPU及内存使用率

    有时感觉网络失去响应,就通过Ubuntu 14.04自带的系统监视器程序来查看当前网速,但是这样很不方便,遂打算让网速显示在标题栏,那样就随时可直观的看到.一番搜索尝试后,成功实现!同时也实现了CPU ...

  8. (笔记)Mysql命令mysqladmin:修改用户密码

    mysqladmin命令用于修改用户密码. mysqladmin命令格式:mysqladmin -u 用户名 -p 旧密码 password 新密码 1) 给root加个密码ab12首先在DOS下进入 ...

  9. python 调用 C语言函数

    python可以直接调用C语言的函数,本文记录用ctypes调用c语言的方法. test.c #include <stdio.h> int test(char *temp) { print ...

  10. windows系统的便签

    习惯了使用便签,但是重装系统时,一个一个备份太麻烦. win7便笺保存在C:\Users\你的用户名\AppData\Roaming\Microsoft\Sticky Notes\下.重装前拷贝出来, ...