开源工具 — Apache Commons Lang(1)

系统 1814 0

相信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 = {  1 2 3 4 5 6  };  
  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,  1 2 );  
  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,  5 1111 );  
  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 = {  1 2 3 4 5 6  };  
  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,  1 2 );  
  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,  5 1111 );  
  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都有各自的工具包,有众多的选择,但最终的目的只是为了方便我们程序的开发和维护,简化我们编写一些常用的逻辑,提升我们开发的效率,从而达到活在开源,善用开源

开源工具 — Apache Commons Lang(1)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论