1. 程式人生 > >apache commons常用工具類

apache commons常用工具類

1.有些情況下,Arrays滿足不到你對陣列的操作?不要緊,ArrayUtils幫你

ArrayUtils

 
  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. }

2.還在使用傳統反射嗎?還在被反射的樣板程式碼困擾?看commons如何幫助我們簡化反射的工作,從樣板程式碼抽身 
ClassUtils

 
  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 

 
  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

 
  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 

 
  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. }

3. 很多情況下我們都需要將字串轉換為數字,或判斷字串是否是數字等等操作,NumberUtils幫助我們方便的從字串轉換為數字,在不使用NumberUtils情況下,若然字串值不是數字,使用Integer.parseInt()時會報出java.lang.NumberFormatException,但在NumberUtils的情況下,只會返回0而不產生錯誤NumberUtils  and  RandomUtils 

 
  1. public class TestMain {

  2.  public static void main(String[] args) throws IllegalAccessException {

  3.   String str = "12.7";

  4.   /*

  5.    * org.apache.commons.lang.NumberUtils已經被棄用,

  6.    * 注意要引入org.apache.commons.lang.math.NumberUtils

  7.    */

  8.  
  9.   // 判斷字串是否為整數

  10.   NumberUtils.isDigits(str);

  11.  
  12.   // 判斷字串是否為數字

  13.   NumberUtils.isNumber(str);

  14.  
  15.   // 獲取引數中最大的值,支援傳入陣列

  16.   NumberUtils.max(10, 20, 30);

  17.  
  18.   // 獲取引數中最小的值,支援傳入陣列

  19.   NumberUtils.min(10, 20, 30);

  20.  
  21.   // 將字串轉換為int型別,支援float,long,short等數值型別

  22.   NumberUtils.toInt(str);

  23.  
  24.   // 通過字串建立BigDecimal型別 ,支援int,float,long等數值

  25.   NumberUtils.createBigDecimal(str);

  26.  
  27.  
  28.   /*

  29.    * RandomUtils幫助我們產生隨機數,不止是數字型別 , 

  30.    * 連boolean型別都可以通過RandomUtils產生

  31.    */

  32.   RandomUtils.nextBoolean();

  33.   RandomUtils.nextDouble();

  34.   RandomUtils.nextLong();

  35.   // 注意這裡傳入的引數不是隨機種子,而是在0~1000之間產生一位隨機數

  36.   RandomUtils.nextInt(1000);

  37.  
  38.  }

  39. }

4. 在開發當中字串的使用和操作時最為頻繁的,而null的字串經常讓我們報出NullPointerException,在使用StringUtils後,將不需要為字串的null值而煩惱,卻又提供了更多的操作讓我們更方便的操作字串 

StringUtils 
 

 
  1. public class TestMain {

  2.  public static void main(String[] args) throws IllegalAccessException {

  3.   String str = "Hello World";

  4.   /*

  5.    * 由於StringUtils擁有100+的方法,筆者不逐一列舉用法,

  6.    * 只列舉筆者認為常用的或筆者使用過的

  7.    */

  8.  
  9.   // isEmpty和isBlank的區別在於isEmpty不會忽略空格,

  10.   // " "<--對於這樣的字串isEmpty會認為不是空,

  11.         // 而isBlank會認為是空,isBlank更常用

  12.   StringUtils.isEmpty(str);

  13.   StringUtils.isNotEmpty(str);

  14.   StringUtils.isBlank(str);

  15.   StringUtils.isNotBlank(str);

  16.   // strip      --> 去除兩端的aa

  17.   // stripStart --> 去除開始位置的hell

  18.   // stripEnd   --> 去除結尾位置的orld

  19.   StringUtils.strip(str, "aa");

  20.   StringUtils.stripStart(str, "hell");

  21.   StringUtils.stripEnd(str, "orld");

  22.  
  23.  
  24.   // 返回字串在第三次出現A的位置

  25.   StringUtils.ordinalIndexOf(str, "A", 3);

  26.  
  27.  
  28.   // 獲取str 開始為hello結尾為orld中間的字串

  29.   // 注意此方法返回字串      -->substringBetween

  30.   // 注意此方法返回字串陣列(多了個s) --> substringsBetween

  31.   StringUtils.substringBetween(str, "hell", "orld");

  32.   StringUtils.substringsBetween(str, "hell", "orld");

  33.  
  34.  
  35.   // 重複字串,第二種過載形式為在重複中用hahah拼接

  36.   StringUtils.repeat(str, 3);

  37.   StringUtils.repeat(str, "hahah", 2);

  38.  
  39.  
  40.   // 統計引數2在字串中出現的次數

  41.   StringUtils.countMatches(str, "l");

  42.  
  43.  
  44.   // 判斷字串是否全小寫或大寫

  45.   StringUtils.isAllLowerCase(str);

  46.   StringUtils.isAllUpperCase(str);

  47.  
  48.  
  49.   // isAlpha        --> 全部由字母組成返回true

  50.   // isNumeric      -->全部由數字組成返回true

  51.   // isAlphanumeric -->全部由字母或數字組成返回true

  52.   // isAlphaSpace   -->全部由字母或空格組成返回true

  53.   // isWhitespace   -->全部由空格組成返回true

  54.   StringUtils.isAlpha(str);

  55.   StringUtils.isNumeric(str);

  56.   StringUtils.isAlphanumeric(str);

  57.   StringUtils.isAlphaSpace(str);

  58.   StringUtils.isWhitespace(str);

  59.  
  60.  
  61.   // 縮排字串,第二引數最低為 4,要包含...

  62.   // 現在Hello World輸出為H...

  63.   StringUtils.abbreviate(str, 4);

  64.  
  65.  
  66.   // 首字母大寫或小寫

  67.   StringUtils.capitalize(str);

  68.   StringUtils.uncapitalize(str);

  69.  
  70.  
  71.   // 將字串陣列轉變為一個字串,通過","拼接,支援傳入iterator和collection

  72.   StringUtils.join(new String[] { "Hello", "World" }, ",");

  73.  
  74.  
  75.  
  76.   /*

  77.    * 經常性要把後臺的字串傳遞到前提作為html程式碼進行解釋,

  78.    * 可以使用以下方法進行轉換,以下方法輸出為

  79.    * <p>Hello</p>

  80.    */

  81.   StringEscapeUtils.escapeHtml("Hello

  82. ");

  83.  }

  84. }

5.DateUtils and DateFormatUtils 

 
  1. public class TestMain {

  2.  public static void main(String[] args) throws IllegalAccessException {

  3.   Date day1 = new Date();

  4.   /*

  5.    * 由於Aache的DateUtils和DateFormatUtils並沒有Joda強大,

  6.    *  所以在這裡只作簡單的示例

  7.    */

  8.   

  9.   // 增加一天

  10.   DateUtils.addDays(day1, 1);

  11.   // 減少一年

  12.   DateUtils.addYears(day1, -1);

  13.  
  14.   // 格式化時間,第三引數為國際化,表示按美國時間顯示

  15.   DateFormatUtils.format(day1, "yyyy-MM-dd", Locale.UK);

  16.  
  17.  }

  18. }

讀者在使用時可能會發現,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都有各自的工具包,有眾多的選擇,但最終的目的只是為了方便我們程式的開發和維護,簡化我們編寫一些常用的邏輯,提升我們開發的效率,從而達到活在開源,善用開源 

ps:

Apache Commons是一個非常有用的工具包,解決各種實際的通用問題,下面是一個簡述表,詳細資訊訪問http://jakarta.apache.org/commons/index.html

BeanUtils
Commons-BeanUtils 提供對 Java 反射和自省API的包裝

Betwixt
Betwixt提供將 JavaBean 對映至 XML 文件,以及相反對映的服務.

Chain
Chain 提供實現組織複雜的處理流程的“責任鏈模式”.

CLI
CLI 提供針對命令列引數,選項,選項組,強制選項等的簡單API.

Codec
Codec 包含一些通用的編碼解碼演算法。包括一些語音編碼器, Hex, Base64, 以及URL encoder.

Collections
Commons-Collections 提供一個類包來擴充套件和增加標準的 Java Collection框架

Configuration
Commons-Configuration 工具對各種各式的配置和參考檔案提供讀取幫助.

Daemon
一種 unix-daemon-like java 程式碼的替代機制

DBCP
Commons-DBCP 提供資料庫連線池服務

DbUtils
DbUtils 是一個 JDBC helper 類庫,完成資料庫任務的簡單的資源清除程式碼.

Digester
Commons-Digester 是一個 XML-Java物件的對映工具,用於解析 XML配置檔案.

Discovery
Commons-Discovery 提供工具來定位資源 (包括類) ,通過使用各種模式來對映服務/引用名稱和資源名稱。.

EL
Commons-EL 提供在JSP2.0規範中定義的EL表示式的直譯器.

FileUpload
FileUpload 使得在你可以在應用和Servlet中容易的加入強大和高效能的檔案上傳能力

HttpClient
Commons-HttpClient 提供了可以工作於HTTP協議客戶端的一個框架.

IO
IO 是一個 I/O 工具集

Jelly
Jelly是一個基於 XML 的指令碼和處理引擎。 Jelly 借鑑了 JSP 定指標籤,Velocity, Cocoon和Xdoclet中的指令碼引擎的許多優點。Jelly 可以用在命令列, Ant 或者 Servlet之中。

Jexl
Jexl是一個表示式語言,通過借鑑來自於Velocity的經驗擴充套件了JSTL定義的表示式語言。.

JXPath
Commons-JXPath 提供了使用Xpath語法操縱符合Java類命名規範的 JavaBeans的工具。也支援 maps, DOM 和其他物件模型。.

Lang
Commons-Lang 提供了許多許多通用的工具類集,提供了一些java.lang中類的擴充套件功能

Latka
Commons-Latka 是一個HTTP 功能測試包,用於自動化的QA,驗收和衰減測試.

Launcher
Launcher 元件是一個交叉平臺的Java 應用載入器。 Commons-launcher 消除了需要批處理或者Shell指令碼來載入Java 類。.原始的 Java 類來自於Jakarta Tomcat 4.0 專案

Logging
Commons-Logging 是一個各種 logging API實現的包裹類.

Math
Math 是一個輕量的,自包含的數學和統計元件,解決了許多非常通用但沒有及時出現在Java標準語言中的實踐問題.

Modeler
Commons-Modeler 提供了建模相容JMX規範的 Mbean的機制.

Net
Net 是一個網路工具集,基於 NetComponents 程式碼,包括 FTP 客戶端等等。

Pool
Commons-Pool 提供了通用物件池介面,一個用於建立模組化物件池的工具包,以及通常的物件池實現.

Primitives
Commons-Primitives提供了一個更小,更快和更易使用的對Java基本型別的支援。當前主要是針對基本型別的 collection。.

Validator
The commons-validator提供了一個簡單的,可擴充套件的框架來在一個XML檔案中定義校驗器 (校驗方法)和校驗規則。支援校驗規則的和錯誤訊息的國際化。