Java开源工具使用介绍

    -----Apache Commons Lang

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

1. ArrayUtils

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

public class TestMain {  
 
    public static void main(String[] args) {  
        int[] nums1 = { 1, 2, 3, 4, 5, 6 };  
        // 通过常量创建新数组  
        int[] nums2 = ArrayUtils.EMPTY_INT_ARRAY;  
 
        // 比较两个数组是否相等  
        ArrayUtils.isEquals(nums1, nums2);  
 
        // 输出数组,第二参数为数组为空时代替输出  
        ArrayUtils.toString(nums1, "array is null");  
 
        // 克隆新数组,注意此拷贝为深拷贝  
        int[] nums3 = ArrayUtils.clone(nums1);  
 
        // 截取数组  
        ArrayUtils.subarray(nums1, 1, 2);  
 
        // 判断两个数组长度是否相等  
        ArrayUtils.isSameLength(nums1, nums2);  
 
        // 判断两个数组类型是否相等,注意int和Integer比较时不相等  
        ArrayUtils.isSameType(nums1, nums2);  
 
        // 反转数组  
        ArrayUtils.reverse(nums1);  
 
        // 查找数组元素位置  
        ArrayUtils.indexOf(nums1, 5);  
 
        // 查找数组元素最后出现位置  
        ArrayUtils.lastIndexOf(nums1, 4);  
 
        // 查找元素是否存在数组中  
        ArrayUtils.contains(nums1, 2);  
 
        // 将基本数组类型转为包装类型  
        Integer[] nums4 = ArrayUtils.toObject(nums1);  
 
        // 判断是否为空,length=0或null都属于  
        ArrayUtils.isEmpty(nums1);  
 
        // 并集操作,合并数组  
        ArrayUtils.addAll(nums1, nums2);  
 
        // 增加元素,在下标5中插入10,注意此处返回是新数组  
        ArrayUtils.add(nums1, 5, 1111);  
 
        // 删除指定位置元素,注意返回新数组,删除元素后面的元素会前移,保持数组有序  
        ArrayUtils.remove(nums1, 5);  
 
        // 删除数组中值为10的元素,以值计算不以下标  
        ArrayUtils.removeElement(nums1, 10);  
    }  
}


2. ClassUtils

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

public class TestMain {    
   
    public static void main(String[] args) {    
        // 获取Test类所有实现的接口    
        ClassUtils.getAllInterfaces(Test.class);    
   
        // 获取Test类所有父类    
        ClassUtils.getAllSuperclasses(Test.class);    
   
        // 获取Test类所在的包名    
        ClassUtils.getPackageName(Test.class);    
   
        // 获取Test类简单类名    
        ClassUtils.getShortClassName(Test.class);    
   
        // 判断是否可以转型    
        ClassUtils.isAssignable(Test.class, Object.class);    
   
        // 判断是否有内部类    
        ClassUtils.isInnerClass(Test.class);    
   
    }    
}


3. ConstructorUtils

public class TestMain {    
   
    public static void main(String[] args) {    
   
        // 获取参数为String的构造函数    
        ConstructorUtils.getAccessibleConstructor(Test.class, String.class);    
   
        // 执行参数为String的构造函数    
        Test test = (Test) ConstructorUtils.invokeConstructor(Test.class,"Hello");    
    }    
}


4. MethodUtils

public static void main(String[] args) throws NoSuchMethodException,    
            IllegalAccessException, InvocationTargetException {    
        // 调用无参方法    
        Test test = new Test();    
        MethodUtils.invokeMethod(test, "publicHello", null);    
   
        // 调用一参方法    
        MethodUtils.invokeMethod(test, "publicHello", "Hello");    
   
        // 调用多参方法    
        MethodUtils.invokeMethod(test, "publicHello", new Object[] { "100",    
                new Integer(10) });    
   
        // 调用静态方法    
        MethodUtils.invokeStaticMethod(Test.class, "staticHello", null);    
    }


5. FieldUtils

public class TestMain {    
   
    public static void main(String[] args) throws IllegalAccessException {    
        Test test = new Test("1", "Ray", "hello");    
   
        // 以下两个方法完全一样,都能获取共有或私有变量,因为第三个参数都设置了不检查    
        FieldUtils.getDeclaredField(Test.class, "username", true);    
        FieldUtils.getField(Test.class, "username", true);    
   
        // 读取私有或公共变量的值    
        FieldUtils.readField(test, "username", true);    
   
        // 读取静态变量    
        FieldUtils.readStaticField(Test.class, "STATIC_FIELD");    
   
        // 写入私有或共有变量    
        FieldUtils.writeField(test, "username", "RayRay", true);    
   
        // 写入静态变量    
        FieldUtils.writeStaticField(Test.class, "STATIC_FIELD", "static_value");    
    }    
}

读者在使用时可能会发现,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 


6. NumberUtils  and  RandomUtils 

很多情况下我们都需要将字符串转换为数字,或判断字符串是否是数字等等操作,NumberUtils帮助我们方便的从字符串转换为数字,在不使用NumberUtils情况下,若然字符串值不是数字,使用Integer.parseInt()时会报出java.lang.NumberFormatException,但在NumberUtils的情况下,只会返回0而不产生错误 

public class TestMain {    
    public static void main(String[] args) throws IllegalAccessException {    
        String str = "12.7";    
        /*   
         * org.apache.commons.lang.NumberUtils已经被弃用,   
         * 注意要引入org.apache.commons.lang.math.NumberUtils   
         */   
   
        // 判断字符串是否为整数    
        NumberUtils.isDigits(str);    
   
        // 判断字符串是否为数字    
        NumberUtils.isNumber(str);    
   
        // 获取参数中最大的值,支持传入数组    
        NumberUtils.max(10, 20, 30);    
   
        // 获取参数中最小的值,支持传入数组    
        NumberUtils.min(10, 20, 30);    
   
        // 将字符串转换为int类型,支持float,long,short等数值类型    
        NumberUtils.toInt(str);    
   
        // 通过字符串创建BigDecimal类型 ,支持int,float,long等数值    
        NumberUtils.createBigDecimal(str);    
   
   
        /*   
         * RandomUtils帮助我们产生随机数,不止是数字类型 ,    
         * 连boolean类型都可以通过RandomUtils产生   
         */   
        RandomUtils.nextBoolean();    
        RandomUtils.nextDouble();    
        RandomUtils.nextLong();    
        // 注意这里传入的参数不是随机种子,而是在0~1000之间产生一位随机数    
        RandomUtils.nextInt(1000);    
   
    }    
}


7. StringUtils

在开发当中字符串的使用和操作时最为频繁的,而null的字符串经常让我们报出NullPointerException,在使用StringUtils后,将不需要为字符串的null值而烦恼,却又提供了更多的操作让我们更方便的操作字符串 

public class TestMain {    
    public static void main(String[] args) throws IllegalAccessException {    
        String str = "Hello World";    
        /*   
         * 由于StringUtils拥有100+的方法,笔者不逐一列举用法,   
         * 只列举笔者认为常用的或笔者使用过的   
         */   
   
        // isEmpty和isBlank的区别在于isEmpty不会忽略空格,    
        // " "<--对于这样的字符串isEmpty会认为不是空,    
        // 而isBlank会认为是空,isBlank更常用    
        StringUtils.isEmpty(str);    
        StringUtils.isNotEmpty(str);    
        StringUtils.isBlank(str);    
        StringUtils.isNotBlank(str);    
   
   
        // strip      --> 去除两端的aa    
        // stripStart --> 去除开始位置的hell    
        // stripEnd   --> 去除结尾位置的orld    
        StringUtils.strip(str, "aa");    
        StringUtils.stripStart(str, "hell");    
        StringUtils.stripEnd(str, "orld");    
   
   
        // 返回字符串在第三次出现A的位置    
        StringUtils.ordinalIndexOf(str, "A", 3);    
   
   
        // 获取str 开始为hello结尾为orld中间的字符串    
        // 注意此方法返回字符串      -->substringBetween    
        // 注意此方法返回字符串数组(多了个s) --> substringsBetween    
        StringUtils.substringBetween(str, "hell", "orld");    
        StringUtils.substringsBetween(str, "hell", "orld");    
   
   
        // 重复字符串,第二种重载形式为在重复中用hahah拼接    
        StringUtils.repeat(str, 3);    
        StringUtils.repeat(str, "hahah", 2);    
   
   
        // 统计参数2在字符串中出现的次数    
        StringUtils.countMatches(str, "l");    
   
   
        // 判断字符串是否全小写或大写    
        StringUtils.isAllLowerCase(str);    
        StringUtils.isAllUpperCase(str);    
   
   
        // isAlpha        --> 全部由字母组成返回true    
        // isNumeric      -->全部由数字组成返回true    
        // isAlphanumeric -->全部由字母或数字组成返回true    
        // isAlphaSpace   -->全部由字母或空格组成返回true    
        // isWhitespace   -->全部由空格组成返回true    
        StringUtils.isAlpha(str);    
        StringUtils.isNumeric(str);    
        StringUtils.isAlphanumeric(str);    
        StringUtils.isAlphaSpace(str);    
        StringUtils.isWhitespace(str);    
   
   
        // 缩进字符串,第二参数最低为 4,要包含...    
        // 现在Hello World输出为H...    
        StringUtils.abbreviate(str, 4);    
   
   
        // 首字母大写或小写    
        StringUtils.capitalize(str);    
        StringUtils.uncapitalize(str);    
   
   
        // 将字符串数组转变为一个字符串,通过","拼接,支持传入iterator和collection    
        StringUtils.join(new String[] { "Hello", "World" }, ",");    
   
        /*   
         * 经常性要把后台的字符串传递到前提作为html代码进行解释,   
         * 可以使用以下方法进行转换,以下方法输出为   
         * <p>Hello</p>   
         */   
        StringEscapeUtils.escapeHtml("Hello    
");    
    }    
}


8. DateUtils and DateFormatUtils

public class TestMain {    
    public static void main(String[] args) throws IllegalAccessException {    
        Date day1 = new Date();    
        /*   
         * 由于Aache的DateUtils和DateFormatUtils并没有Joda强大,   
         *  所以在这里只作简单的示例   
         */   
            
        // 增加一天    
        DateUtils.addDays(day1, 1);    
        // 减少一年    
        DateUtils.addYears(day1, -1);    
   
        // 格式化时间,第三参数为国际化,表示按美国时间显示    
        DateFormatUtils.format(day1, "yyyy-MM-dd", Locale.UK);    
   
    }    
}


9. Builder系列

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

//ToStringBuilder  
@Override 
public String toString() {  
    return new ToStringBuilder(this).append(this.getId())  
            .append(this.getUsername()).toString();  
}  
 
@Override 
public String toString() {  
    return ToStringBuilder.reflectionToString(this);  
}  
// 以上输出格式为  Test@1270b73[<null>,<null>]  
 
 
 
// HashCodeBuilder  
@Override 
public int hashCode() {  
    return HashCodeBuilder.reflectionHashCode(this);  
}  
 
@Override 
public int hashCode() {  
    return new HashCodeBuilder(this).append(this.getId())  
            .append(this.getUsername()).hashCode();  
}  
 
 
// EqulasBuilder  
@Override 
public boolean equals(Object obj) {  
    if (this == obj) {  
        return true;  
    }  
    if (obj.getClass() == Test.class) {  
        Test test = (Test) obj;  
        return new EqualsBuilder().append(this.getId(), test.getId())  
                .append(this.getUsername(), test.getUsername()).isEquals();  
    }  
    return false;  
}  

@Override 
public boolean equals(Object obj) {  
    return EqualsBuilder.reflectionEquals(this, obj);  
}  
 
 
// CompareToBuilder  
@Override 
public int compareTo(Test o) {  
    return CompareToBuilder.reflectionCompare(this, o);  
}  
 
@Override 
public int compareTo(Test o) {  
    return new CompareToBuilder().append(this.getId(), o.getId())  
            .append(this.getUsername(), o.getUsername()).toComparison();  
}

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


以上内容摘至:http://blog.csdn.net/jiutianhe/article/details/42171529


10. 其他参考

1. 一些常用Java操作方法封装:Java Utils:

http://www.open-open.com/lib/view/open1434350204458.html

https://github.com/evil0ps/utils

2. Java程序员常用工具类库 - 目录

http://rensanning.iteye.com/blog/1553076:本文归作者所有,未经作者允许,不得转载