`

开源工具 — Apache Commons Lang(1)

 
阅读更多

相信Apache的大名各位一定不会陌生,Java领域中常用的Ant,Maven,Struts1~2等都是托管在Apache下的项目,而在使用Apache框架的时候,通常要添加框架的依赖包,包括apache-commons系列的依赖包,相信读者对此也不会陌生,而apache-common是非常有用的工具包,包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动 


      一个优秀的类应该重写toString,hashCode,equals,compareTo方法,我们来看一下apache如何带我们简化这些操作,以下示例支持两种形式,一种是通过逐个参数添加从而精细控制那些参数参与比较和输出,另一种是通过反射让全部参数都参与比较和输出 

      Builder系列 

Java代码  
  1. //ToStringBuilder  
  2. @Override  
  3. public String toString() {  
  4.     return new ToStringBuilder(this).append(this.getId())  
  5.             .append(this.getUsername()).toString();  
  6. }  
  7.   
  8. @Override  
  9. public String toString() {  
  10.     return ToStringBuilder.reflectionToString(this);  
  11. }  
  12. // 以上输出格式为  Test@1270b73[<null>,<null>]  
  13.   
  14.   
  15.   
  16. // HashCodeBuilder  
  17. @Override  
  18. public int hashCode() {  
  19.     return HashCodeBuilder.reflectionHashCode(this);  
  20. }  
  21.   
  22. @Override  
  23. public int hashCode() {  
  24.     return new HashCodeBuilder(this).append(this.getId())  
  25.             .append(this.getUsername()).hashCode();  
  26. }  
  27.   
  28.   
  29.   
  30. // EqulasBuilder  
  31. @Override  
  32. public boolean equals(Object obj) {  
  33.     if (this == obj) {  
  34.         return true;  
  35.     }  
  36.     if (obj.getClass() == Test.class) {  
  37.         Test test = (Test) obj;  
  38.         return new EqualsBuilder().append(this.getId(), test.getId())  
  39.                 .append(this.getUsername(), test.getUsername()).isEquals();  
  40.     }  
  41.     return false;  
  42. }  
  43. @Override  
  44. public boolean equals(Object obj) {  
  45.     return EqualsBuilder.reflectionEquals(this, obj);  
  46. }  
  47.   
  48.   
  49. // CompareToBuilder  
  50. @Override  
  51. public int compareTo(Test o) {  
  52.     return CompareToBuilder.reflectionCompare(this, o);  
  53. }  
  54.   
  55. @Override  
  56. public int compareTo(Test o) {  
  57.     return new CompareToBuilder().append(this.getId(), o.getId())  
  58.             .append(this.getUsername(), o.getUsername()).toComparison();  
  59. }  
Java代码  收藏代码
  1. //ToStringBuilder  
  2. @Override  
  3. public String toString() {  
  4.     return new ToStringBuilder(this).append(this.getId())  
  5.             .append(this.getUsername()).toString();  
  6. }  
  7.   
  8. @Override  
  9. public String toString() {  
  10.     return ToStringBuilder.reflectionToString(this);  
  11. }  
  12. // 以上输出格式为  Test@1270b73[<null>,<null>]  
  13.   
  14.   
  15.   
  16. // HashCodeBuilder  
  17. @Override  
  18. public int hashCode() {  
  19.     return HashCodeBuilder.reflectionHashCode(this);  
  20. }  
  21.   
  22. @Override  
  23. public int hashCode() {  
  24.     return new HashCodeBuilder(this).append(this.getId())  
  25.             .append(this.getUsername()).hashCode();  
  26. }  
  27.   
  28.   
  29.   
  30. // EqulasBuilder  
  31. @Override  
  32. public boolean equals(Object obj) {  
  33.     if (this == obj) {  
  34.         return true;  
  35.     }  
  36.     if (obj.getClass() == Test.class) {  
  37.         Test test = (Test) obj;  
  38.         return new EqualsBuilder().append(this.getId(), test.getId())  
  39.                 .append(this.getUsername(), test.getUsername()).isEquals();  
  40.     }  
  41.     return false;  
  42. }  
  43. @Override  
  44. public boolean equals(Object obj) {  
  45.     return EqualsBuilder.reflectionEquals(this, obj);  
  46. }  
  47.   
  48.   
  49. // CompareToBuilder  
  50. @Override  
  51. public int compareTo(Test o) {  
  52.     return CompareToBuilder.reflectionCompare(this, o);  
  53. }  
  54.   
  55. @Override  
  56. public int compareTo(Test o) {  
  57.     return new CompareToBuilder().append(this.getId(), o.getId())  
  58.             .append(this.getUsername(), o.getUsername()).toComparison();  
  59. }  



      使用commons能最大程度的简化代码,实现one-line编程,注意使用反射形式的时候,static和transient不会参与比较或输出,要特别注意 


      有些情况下,Arrays满足不到你对数组的操作?不要紧,ArrayUtils帮你 

      ArrayUtils 

Java代码  
  1. public class TestMain {  
  2.   
  3.     public static void main(String[] args) {  
  4.         int[] nums1 = { 123456 };  
  5.         // 通过常量创建新数组  
  6.         int[] nums2 = ArrayUtils.EMPTY_INT_ARRAY;  
  7.   
  8.         // 比较两个数组是否相等  
  9.         ArrayUtils.isEquals(nums1, nums2);  
  10.   
  11.         // 输出数组,第二参数为数组为空时代替输出  
  12.         ArrayUtils.toString(nums1, "array is null");  
  13.   
  14.         // 克隆新数组,注意此拷贝为深拷贝  
  15.         int[] nums3 = ArrayUtils.clone(nums1);  
  16.   
  17.         // 截取数组  
  18.         ArrayUtils.subarray(nums1, 12);  
  19.   
  20.         // 判断两个数组长度是否相等  
  21.         ArrayUtils.isSameLength(nums1, nums2);  
  22.   
  23.         // 判断两个数组类型是否相等,注意int和Integer比较时不相等  
  24.         ArrayUtils.isSameType(nums1, nums2);  
  25.   
  26.         // 反转数组  
  27.         ArrayUtils.reverse(nums1);  
  28.   
  29.         // 查找数组元素位置  
  30.         ArrayUtils.indexOf(nums1, 5);  
  31.   
  32.         // 查找数组元素最后出现位置  
  33.         ArrayUtils.lastIndexOf(nums1, 4);  
  34.   
  35.         // 查找元素是否存在数组中  
  36.         ArrayUtils.contains(nums1, 2);  
  37.   
  38.         // 将基本数组类型转为包装类型  
  39.         Integer[] nums4 = ArrayUtils.toObject(nums1);  
  40.   
  41.         // 判断是否为空,length=0或null都属于  
  42.         ArrayUtils.isEmpty(nums1);  
  43.   
  44.         // 并集操作,合并数组  
  45.         ArrayUtils.addAll(nums1, nums2);  
  46.   
  47.         // 增加元素,在下标5中插入10,注意此处返回是新数组  
  48.         ArrayUtils.add(nums1, 51111);  
  49.   
  50.         // 删除指定位置元素,注意返回新数组,删除元素后面的元素会前移,保持数组有序  
  51.         ArrayUtils.remove(nums1, 5);  
  52.   
  53.         // 删除数组中值为10的元素,以值计算不以下标  
  54.         ArrayUtils.removeElement(nums1, 10);  
  55.     }  
  56. }  
Java代码  收藏代码
  1. public class TestMain {  
  2.   
  3.     public static void main(String[] args) {  
  4.         int[] nums1 = { 123456 };  
  5.         // 通过常量创建新数组  
  6.         int[] nums2 = ArrayUtils.EMPTY_INT_ARRAY;  
  7.   
  8.         // 比较两个数组是否相等  
  9.         ArrayUtils.isEquals(nums1, nums2);  
  10.   
  11.         // 输出数组,第二参数为数组为空时代替输出  
  12.         ArrayUtils.toString(nums1, "array is null");  
  13.   
  14.         // 克隆新数组,注意此拷贝为深拷贝  
  15.         int[] nums3 = ArrayUtils.clone(nums1);  
  16.   
  17.         // 截取数组  
  18.         ArrayUtils.subarray(nums1, 12);  
  19.   
  20.         // 判断两个数组长度是否相等  
  21.         ArrayUtils.isSameLength(nums1, nums2);  
  22.   
  23.         // 判断两个数组类型是否相等,注意int和Integer比较时不相等  
  24.         ArrayUtils.isSameType(nums1, nums2);  
  25.   
  26.         // 反转数组  
  27.         ArrayUtils.reverse(nums1);  
  28.   
  29.         // 查找数组元素位置  
  30.         ArrayUtils.indexOf(nums1, 5);  
  31.   
  32.         // 查找数组元素最后出现位置  
  33.         ArrayUtils.lastIndexOf(nums1, 4);  
  34.   
  35.         // 查找元素是否存在数组中  
  36.         ArrayUtils.contains(nums1, 2);  
  37.   
  38.         // 将基本数组类型转为包装类型  
  39.         Integer[] nums4 = ArrayUtils.toObject(nums1);  
  40.   
  41.         // 判断是否为空,length=0或null都属于  
  42.         ArrayUtils.isEmpty(nums1);  
  43.   
  44.         // 并集操作,合并数组  
  45.         ArrayUtils.addAll(nums1, nums2);  
  46.   
  47.         // 增加元素,在下标5中插入10,注意此处返回是新数组  
  48.         ArrayUtils.add(nums1, 51111);  
  49.   
  50.         // 删除指定位置元素,注意返回新数组,删除元素后面的元素会前移,保持数组有序  
  51.         ArrayUtils.remove(nums1, 5);  
  52.   
  53.         // 删除数组中值为10的元素,以值计算不以下标  
  54.         ArrayUtils.removeElement(nums1, 10);  
  55.     }  
  56. }  



      还在使用传统反射吗?还在被反射的样板代码困扰?看commons如何帮助我们简化反射的工作,从样板代码抽身 

      ClassUtils 

Java代码  
  1. public class TestMain {  
  2.   
  3.     public static void main(String[] args) {  
  4.         // 获取Test类所有实现的接口  
  5.         ClassUtils.getAllInterfaces(Test.class);  
  6.   
  7.         // 获取Test类所有父类  
  8.         ClassUtils.getAllSuperclasses(Test.class);  
  9.   
  10.         // 获取Test类所在的包名  
  11.         ClassUtils.getPackageName(Test.class);  
  12.   
  13.         // 获取Test类简单类名  
  14.         ClassUtils.getShortClassName(Test.class);  
  15.   
  16.         // 判断是否可以转型  
  17.         ClassUtils.isAssignable(Test.class, Object.class);  
  18.   
  19.         // 判断是否有内部类  
  20.         ClassUtils.isInnerClass(Test.class);  
  21.   
  22.     }  
  23. }  
Java代码  收藏代码
  1. public class TestMain {  
  2.   
  3.     public static void main(String[] args) {  
  4.         // 获取Test类所有实现的接口  
  5.         ClassUtils.getAllInterfaces(Test.class);  
  6.   
  7.         // 获取Test类所有父类  
  8.         ClassUtils.getAllSuperclasses(Test.class);  
  9.   
  10.         // 获取Test类所在的包名  
  11.         ClassUtils.getPackageName(Test.class);  
  12.   
  13.         // 获取Test类简单类名  
  14.         ClassUtils.getShortClassName(Test.class);  
  15.   
  16.         // 判断是否可以转型  
  17.         ClassUtils.isAssignable(Test.class, Object.class);  
  18.   
  19.         // 判断是否有内部类  
  20.         ClassUtils.isInnerClass(Test.class);  
  21.   
  22.     }  
  23. }  



      ConstructorUtils 

Java代码  
  1. public class TestMain {  
  2.   
  3.     public static void main(String[] args) {  
  4.   
  5.         // 获取参数为String的构造函数  
  6.         ConstructorUtils.getAccessibleConstructor(Test.class, String.class);  
  7.   
  8.         // 执行参数为String的构造函数  
  9.         Test test = (Test) ConstructorUtils.invokeConstructor(Test.class,  
  10.                 "Hello");  
  11.     }  
  12. }  
Java代码  收藏代码
  1. public class TestMain {  
  2.   
  3.     public static void main(String[] args) {  
  4.   
  5.         // 获取参数为String的构造函数  
  6.         ConstructorUtils.getAccessibleConstructor(Test.class, String.class);  
  7.   
  8.         // 执行参数为String的构造函数  
  9.         Test test = (Test) ConstructorUtils.invokeConstructor(Test.class,  
  10.                 "Hello");  
  11.     }  
  12. }  



      MethodUtils 

Java代码  
  1. public static void main(String[] args) throws NoSuchMethodException,  
  2.             IllegalAccessException, InvocationTargetException {  
  3.         // 调用无参方法  
  4.         Test test = new Test();  
  5.         MethodUtils.invokeMethod(test, "publicHello"null);  
  6.   
  7.         // 调用一参方法  
  8.         MethodUtils.invokeMethod(test, "publicHello""Hello");  
  9.   
  10.         // 调用多参方法  
  11.         MethodUtils.invokeMethod(test, "publicHello"new Object[] { "100",  
  12.                 new Integer(10) });  
  13.   
  14.         // 调用静态方法  
  15.         MethodUtils.invokeStaticMethod(Test.class"staticHello"null);  
  16.     }  
Java代码  收藏代码
  1. public static void main(String[] args) throws NoSuchMethodException,  
  2.             IllegalAccessException, InvocationTargetException {  
  3.         // 调用无参方法  
  4.         Test test = new Test();  
  5.         MethodUtils.invokeMethod(test, "publicHello"null);  
  6.   
  7.         // 调用一参方法  
  8.         MethodUtils.invokeMethod(test, "publicHello""Hello");  
  9.   
  10.         // 调用多参方法  
  11.         MethodUtils.invokeMethod(test, "publicHello"new Object[] { "100",  
  12.                 new Integer(10) });  
  13.   
  14.         // 调用静态方法  
  15.         MethodUtils.invokeStaticMethod(Test.class"staticHello"null);  
  16.     }  



      FieldUtils 

Java代码  
  1. public class TestMain {  
  2.   
  3.     public static void main(String[] args) throws IllegalAccessException {  
  4.         Test test = new Test("1""Ray""hello");  
  5.   
  6.         // 以下两个方法完全一样,都能获取共有或私有变量,因为第三个参数都设置了不检查  
  7.         FieldUtils.getDeclaredField(Test.class"username"true);  
  8.         FieldUtils.getField(Test.class"username"true);  
  9.   
  10.         // 读取私有或公共变量的值  
  11.         FieldUtils.readField(test, "username"true);  
  12.   
  13.         // 读取静态变量  
  14.         FieldUtils.readStaticField(Test.class"STATIC_FIELD");  
  15.   
  16.         // 写入私有或共有变量  
  17.         FieldUtils.writeField(test, "username""RayRay"true);  
  18.   
  19.         // 写入静态变量  
  20.         FieldUtils.writeStaticField(Test.class"STATIC_FIELD""static_value");  
  21.     }  
  22. }  
Java代码  收藏代码
  1. public class TestMain {  
  2.   
  3.     public static void main(String[] args) throws IllegalAccessException {  
  4.         Test test = new Test("1""Ray""hello");  
  5.   
  6.         // 以下两个方法完全一样,都能获取共有或私有变量,因为第三个参数都设置了不检查  
  7.         FieldUtils.getDeclaredField(Test.class"username"true);  
  8.         FieldUtils.getField(Test.class"username"true);  
  9.   
  10.         // 读取私有或公共变量的值  
  11.         FieldUtils.readField(test, "username"true);  
  12.   
  13.         // 读取静态变量  
  14.         FieldUtils.readStaticField(Test.class"STATIC_FIELD");  
  15.   
  16.         // 写入私有或共有变量  
  17.         FieldUtils.writeField(test, "username""RayRay"true);  
  18.   
  19.         // 写入静态变量  
  20.         FieldUtils.writeStaticField(Test.class"STATIC_FIELD""static_value");  
  21.     }  
  22. }  



      读者在使用时可能会发现,MethodUtils和ConstructUtils在org.apache.commons.lang.reflect和org.apache.commons.beanutils都存在,但FieldUtils和ClassUtils只在reflect当中存在,因为beanutils提供了另外一种名为PropertyUtils的对属性存取更为方便的工具,但PropertyUtils不能获取传统反射的Field对象,笔者建议MethodUtils和ConstructUtils应该倾向使用beanutils,因为beanutils就是为反射而存在,更专业(虽然提供的方法几乎一样),而使用ClassUtils和要获取传统的Field对象时使用reflect中的FieldUtils 


总结: 
      commons工具包很多开源组织都有提供,例如google,spring,apache都有各自的工具包,有众多的选择,但最终的目的只是为了方便我们程序的开发和维护,简化我们编写一些常用的逻辑,提升我们开发的效率,从而达到活在开源,善用开源

分享到:
评论

相关推荐

    org.apache.commons.lang包

    Apache Commons Lang是一个非常重要的Java库,它为Java标准类库提供了许多实用的工具类和扩展。这个资源包包含了丰富的功能,极大地增强了Java开发者的生产力。标题中的"org.apache.commons.lang包"指的是该库的主要...

    apache commons-lang简介

    Apache Commons Lang是Java开发中的一个非常重要的开源工具库,它提供了一系列实用的工具类,极大地丰富了Java的标准库,为开发者提供了更便捷、高效的方法来处理常见的编程任务。Lang包主要包含了对字符串操作、...

    apache commons lang、io、collection源码与UT

    Apache Commons 是一个由 Apache 软件基金会维护的开源项目,它提供了许多Java语言的实用工具类库。在这个压缩包中,我们重点关注 Lang、IO 和 Collection 三个模块的源码及相关的单元测试(UT)。这些模块是Java...

    commons-lang3-3.12.0 jar包

    2. **LICENSE.txt**: Apache Commons Lang遵循Apache软件许可证2.0版,这是一个非常宽松的开源许可证,允许自由使用、修改和分发代码,只要保留原有的版权信息即可。 3. **NOTICE.txt**: 这个文件通常包含项目中...

    Apache Commons Lang包源代码

    Apache Commons Lang包源代码是Java开发中的一个关键资源,它为Java程序员提供了许多实用的工具类,涵盖了字符串处理、日期时间、数学运算、反射等多个领域。这个开源项目由Apache Software Foundation维护,旨在...

    Apache Commons组件简介.ppt

    2. **Lang**:Apache Commons Lang 是对Java标准库`java.lang`包的扩展和增强。它提供了许多实用工具类,包括异常处理、字符串操作、日期和时间格式化、枚举操作等,大大丰富了Java基础类的功能。 3. **Math**:...

    apache commons 开源工具列举

    1. **Apache Commons Lang**: 这个模块提供了一系列高级的Java语言功能,包括字符串操作(如格式化、比较、拼写检查)、数组操作、日期和时间处理、反射工具等。例如,StringUtils类提供了大量的静态方法,可以方便...

    commons-lang-2.6.jar

    Apache Commons Lang是Java开发者们广泛使用的开源库之一,其中的2.6版本以其强大的功能和稳定性,在Web开发领域备受推崇。这个工具包提供了大量实用的类和方法,极大地扩展了Java语言的功能,使得开发者能够更加...

    apache.commons全套jar包下载

    5. Apache Commons Lang: 这是Java语言功能的扩展,提供了字符串操作、日期时间处理、枚举工具、数学运算等类。例如,StringUtils提供了丰富的字符串操作方法,DateUtils提供了日期和时间的便捷处理。 6. Apache ...

    apache-commons所有jar包

    Apache Commons 是一个由 Apache 软件基金会维护的开源项目,它提供了大量的 Java 类库,这些类库包含了许多实用的功能,极大地丰富了 Java 核心库的功能,为开发者提供了更强大的工具集。在Web开发中,Apache ...

    commons-lang-2.6.jar配套文档

    首先,`commons-lang-2.6.jar` 是Apache Commons Lang项目的二进制库,包含了众多实用的工具类,如字符串处理、数组操作、日期时间处理等。这些工具类在日常开发中起到了至关重要的作用,比如 `StringUtils` 类提供...

    org.apache.commons jar

    1. **Apache Commons Lang**: 这个模块提供了许多高级字符串处理、日期和时间操作、数学计算以及类型转换等功能。例如,StringUtils 提供了各种字符串操作,如空白字符处理、字符串比较、格式化等;ClassUtils 可以...

    Apache Commons 官方最近所有的jar包

    Apache Commons 是一个由 Apache 软件基金会维护的开源项目集合,它提供了许多Java实用工具类,以增强Java标准库的功能。这些jar包是开发者在处理常见编程任务时的得力助手,涵盖范围广泛,包括数据结构、网络通信、...

    commons-lang-2.4.jar.zip

    Apache Commons Lang遵循Apache软件许可证2.0版,这意味着该库是开源的,可以自由使用、修改和分发,但需要保留原始的版权和许可声明。 总的来说,Apache Commons Lang 2.4在JCO与SAP的对接中扮演着重要角色,提供...

    commons-lang-2.6jar包

    Apache Commons Lang是Apache软件基金会开发的一个开源项目,旨在为Java开发提供一组不包含在JDK中的通用工具类。 Lang项目的主要目标是提供一系列高质量的实用工具类,这些类涵盖了字符串处理、日期和时间操作、...

    Apache Commons官网下的jar包

    Apache Commons 是一个由 Apache 软件基金会维护的开源项目集合,它提供了大量的 Java 类库,这些类库弥补了 Java 核心库中的一些不足,为开发者提供了实用且高效的工具和组件。Apache Commons 项目旨在简化开发过程...

    Apache.commons

    Apache Commons 是一个由 Apache 软件基金会维护的开源项目,它提供了许多Java库,用于解决常见的编程任务。这些库增强了Java标准库的功能,为开发者提供了便利和效率。在这个特定的压缩包中,包含了几个Apache ...

    apache commons 文档

    Apache Commons是Apache软件基金会提供的一个开源Java工具包,它包含了许多独立的Java库,涉及的领域包括字符串操作、数学运算、数组操作、对象反射、XML处理等。本知识点将围绕Apache Commons文档中的关键组件展开...

    commons-lang3-3.3.2

    Apache Commons Lang是Apache软件基金会的一个开源项目,旨在帮助开发者解决日常编程任务。 描述中的"hashCodeBuilder EqualsBuilder ToStringBuilder"提到了三个关键的类,它们都是Apache Commons Lang中用于构建...

    commons-lang3-3.0.js

    Apache Commons Lang 是一个由Apache软件基金会开发的Java库,它的核心部分是`commons-lang3-3.0.js`,这个JavaScript版本的工具集是为了在Web环境中提供与Java Commons Lang相似的功能。这个库包含了大量用于处理...

Global site tag (gtag.js) - Google Analytics