package com.fuint.utils; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 有关Object处理的工具类。 * * 这个类中的每个方法都可以“安全”地处理null,而不会抛出NullPointerException。 * * Created by FSQ * CopyRight https://www.fuint.cn */ public class ObjectUtil { /* ============================================================================ */ /* 常量和singleton。 */ /* ============================================================================ */ /** * 用于表示null的常量。 * *

* 例如,HashMap.get(Object)方法返回null有两种可能: * 值不存在或值为null。而这个singleton可用来区别这两种情形。 *

* *

* 另一个例子是,Hashtable的值不能为null。 *

*/ public static final Object NULL = new Serializable() { private static final long serialVersionUID = 7092611880189329093L; private Object readResolve() { return NULL; } }; /* ============================================================================ */ /* 默认值函数。 */ /* */ /* 当对象为null时,将对象转换成指定的默认对象。 */ /* ============================================================================ */ /** * 如果对象为null,则返回指定默认对象,否则返回对象本身。 *
     * ObjectUtil.defaultIfNull(null, null)      = null
     * ObjectUtil.defaultIfNull(null, "")        = ""
     * ObjectUtil.defaultIfNull(null, "zz")      = "zz"
     * ObjectUtil.defaultIfNull("abc", *)        = "abc"
     * ObjectUtil.defaultIfNull(Boolean.TRUE, *) = Boolean.TRUE
     * 
* * @param object 要测试的对象 * @param defaultValue 默认值 * * @return 对象本身或默认对象 */ public static Object defaultIfNull(Object object, Object defaultValue) { return (object != null) ? object : defaultValue; } /* ============================================================================ */ /* 比较函数。 */ /* */ /* 以下方法用来比较两个对象是否相同。 */ /* ============================================================================ */ /** * 比较两个对象是否完全相等。 * *

* 此方法可以正确地比较多维数组。 *

     * ObjectUtil.equals(null, null)                  = true
     * ObjectUtil.equals(null, "")                    = false
     * ObjectUtil.equals("", null)                    = false
     * ObjectUtil.equals("", "")                      = true
     * ObjectUtil.equals(Boolean.TRUE, null)          = false
     * ObjectUtil.equals(Boolean.TRUE, "true")        = false
     * ObjectUtil.equals(Boolean.TRUE, Boolean.TRUE)  = true
     * ObjectUtil.equals(Boolean.TRUE, Boolean.FALSE) = false
     * 
*

* * @param object1 对象1 * @param object2 对象2 * * @return 如果相等, 则返回true */ public static boolean equals(Object object1, Object object2) { return ArrayUtil.equals(object1, object2); } /* ============================================================================ */ /* Hashcode函数。 */ /* */ /* 以下方法用来取得对象的hash code。 */ /* ============================================================================ */ /** * 取得对象的hash值, 如果对象为null, 则返回0。 * *

* 此方法可以正确地处理多维数组。 *

* * @param object 对象 * * @return hash值 */ public static int hashCode(Object object) { return ArrayUtil.hashCode(object); } /** * 取得对象的原始的hash值, 如果对象为null, 则返回0。 * *

* 该方法使用System.identityHashCode来取得hash值,该值不受对象本身的hashCode方法的影响。 *

* * @param object 对象 * * @return hash值 */ public static int identityHashCode(Object object) { return (object == null) ? 0 : System.identityHashCode(object); } /* ============================================================================ */ /* 取得对象的identity。 */ /* ============================================================================ */ /** * 取得对象自身的identity,如同对象没有覆盖toString()方法时,Object.toString()的原始输出。 *
     * ObjectUtil.identityToString(null)          = null
     * ObjectUtil.identityToString("")            = "java.lang.String@1e23"
     * ObjectUtil.identityToString(Boolean.TRUE)  = "java.lang.Boolean@7fa"
     * ObjectUtil.identityToString(new int[0])    = "int[]@7fa"
     * ObjectUtil.identityToString(new Object[0]) = "java.lang.Object[]@7fa"
     * 
* * @param object 对象 * * @return 对象的identity,如果对象是null,则返回null */ public static String identityToString(Object object) { if (object == null) { return null; } return appendIdentityToString(null, object).toString(); } /** * 取得对象自身的identity,如同对象没有覆盖toString()方法时,Object.toString()的原始输出。 *
     * ObjectUtil.identityToString(null, "NULL")            = "NULL"
     * ObjectUtil.identityToString("", "NULL")              = "java.lang.String@1e23"
     * ObjectUtil.identityToString(Boolean.TRUE, "NULL")    = "java.lang.Boolean@7fa"
     * ObjectUtil.identityToString(new int[0], "NULL")      = "int[]@7fa"
     * ObjectUtil.identityToString(new Object[0], "NULL")   = "java.lang.Object[]@7fa"
     * 
* * @param object 对象 * @param nullStr 如果对象为null,则返回该字符串 * * @return 对象的identity,如果对象是null,则返回指定字符串 */ public static String identityToString(Object object, String nullStr) { if (object == null) { return nullStr; } return appendIdentityToString(null, object).toString(); } /** * 将对象自身的identity——如同对象没有覆盖toString()方法时,Object.toString()的原始输出——追加到StringBuffer中。 *
     * ObjectUtil.appendIdentityToString(*, null)            = null
     * ObjectUtil.appendIdentityToString(null, "")           = "java.lang.String@1e23"
     * ObjectUtil.appendIdentityToString(null, Boolean.TRUE) = "java.lang.Boolean@7fa"
     * ObjectUtil.appendIdentityToString(buf, Boolean.TRUE)  = buf.append("java.lang.Boolean@7fa")
     * ObjectUtil.appendIdentityToString(buf, new int[0])    = buf.append("int[]@7fa")
     * ObjectUtil.appendIdentityToString(buf, new Object[0]) = buf.append("java.lang.Object[]@7fa")
     * 
* * @param buffer StringBuffer对象,如果是null,则创建新的 * @param object 对象 * * @return StringBuffer对象,如果对象为null,则返回null */ public static StringBuffer appendIdentityToString(StringBuffer buffer, Object object) { if (object == null) { return null; } if (buffer == null) { buffer = new StringBuffer(); } buffer.append(ClassUtil.getClassNameForObject(object)); return buffer.append('@').append(Integer.toHexString(identityHashCode(object))); } /* ============================================================================ */ /* Clone函数。 */ /* */ /* 以下方法调用Object.clone方法,默认是“浅复制”(shallow copy)。 */ /* ============================================================================ */ /** * 复制一个对象。如果对象为null,则返回null。 * *

* 此方法调用Object.clone方法,默认只进行“浅复制”。 对于数组,调用ArrayUtil.clone方法更高效。 *

* * @param array 要复制的数组 * * @return 数组的复本,如果原始数组为null,则返回null */ public static Object clone(Object array) { if (array == null) { return null; } // 对数组特殊处理 if (array instanceof Object[]) { return ArrayUtil.clone((Object[]) array); } if (array instanceof long[]) { return ArrayUtil.clone((long[]) array); } if (array instanceof int[]) { return ArrayUtil.clone((int[]) array); } if (array instanceof short[]) { return ArrayUtil.clone((short[]) array); } if (array instanceof byte[]) { return ArrayUtil.clone((byte[]) array); } if (array instanceof double[]) { return ArrayUtil.clone((double[]) array); } if (array instanceof float[]) { return ArrayUtil.clone((float[]) array); } if (array instanceof boolean[]) { return ArrayUtil.clone((boolean[]) array); } if (array instanceof char[]) { return ArrayUtil.clone((char[]) array); } // Not cloneable if (!(array instanceof Cloneable)) { throw new RuntimeException("Object of class " + array.getClass().getName() + " is not Cloneable"); } // 用reflection调用clone方法 Class clazz = array.getClass(); try { Method cloneMethod = clazz.getMethod("clone", ArrayUtil.EMPTY_CLASS_ARRAY); return cloneMethod.invoke(array, ArrayUtil.EMPTY_OBJECT_ARRAY); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } } /* ============================================================================ */ /* 比较对象的类型。 */ /* ============================================================================ */ /** * 检查两个对象是否属于相同类型。null将被看作任意类型。 * * @param object1 对象1 * @param object2 对象2 * * @return 如果两个对象有相同的类型,则返回true */ public static boolean isSameType(Object object1, Object object2) { if ((object1 == null) || (object2 == null)) { return true; } return object1.getClass().equals(object2.getClass()); } /* ============================================================================ */ /* toString方法。 */ /* ============================================================================ */ /** * 取得对象的toString()的值,如果对象为null,则返回空字符串""。 *
     * ObjectUtil.toString(null)         = ""
     * ObjectUtil.toString("")           = ""
     * ObjectUtil.toString("bat")        = "bat"
     * ObjectUtil.toString(Boolean.TRUE) = "true"
     * ObjectUtil.toString([1, 2, 3])    = "[1, 2, 3]"
     * 
* * @param object 对象 * * @return 对象的toString()的返回值,或空字符串"" */ public static String toString(Object object) { return (object == null) ? StringUtil.EMPTY_STRING : (object.getClass().isArray() ? ArrayUtil.toString(object) : object.toString()); } /** * 取得对象的toString()的值,如果对象为null,则返回指定字符串。 *
     * ObjectUtil.toString(null, null)           = null
     * ObjectUtil.toString(null, "null")         = "null"
     * ObjectUtil.toString("", "null")           = ""
     * ObjectUtil.toString("bat", "null")        = "bat"
     * ObjectUtil.toString(Boolean.TRUE, "null") = "true"
     * ObjectUtil.toString([1, 2, 3], "null")    = "[1, 2, 3]"
     * 
* * @param object 对象 * @param nullStr 如果对象为null,则返回该字符串 * * @return 对象的toString()的返回值,或指定字符串 */ public static String toString(Object object, String nullStr) { return (object == null) ? nullStr : (object.getClass().isArray() ? ArrayUtil .toString(object) : object.toString()); } /** * 数字格式化方法 为thyleaf服务 * * @param num * @return */ public static String toNum(Double num){ java.text.DecimalFormat df = new java.text.DecimalFormat("#.##"); try{ if(num == null){ return ""; }else{ return df.format(num); } }catch(Exception e){ return "" ; } } }