日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

開源工具 — Apache Commons Lang(1)

系統 2218 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條評論
主站蜘蛛池模板: 绍兴县| 澄江县| 四川省| 咸宁市| 乐安县| 三都| 勐海县| 海阳市| 乡城县| 曲沃县| 新竹县| 会宁县| 北辰区| 东丽区| 涟水县| 呼图壁县| 南开区| 博白县| 盐城市| 关岭| 闸北区| 永宁县| 陆良县| 天长市| 定西市| 龙泉市| 改则县| 建阳市| 通许县| 天镇县| 霞浦县| 布拖县| 静宁县| 和硕县| 合作市| 东港市| 东山县| 青冈县| 新昌县| 怀安县| 和田县|