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
。
*
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
方法的影响。
*
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
方法更高效。
*
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 "" ;
}
}
}