package com.jarvis.lib.util;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author jiayu.qiu
*/
public class BeanUtil {
@SuppressWarnings("rawtypes")
private static final ConcurrentHashMap<Class, Field[]> fieldsCahce=new ConcurrentHashMap<Class, Field[]>();
/**
* 是否为基础数据类型
* @param obj Object
* @return boolean true or false
*/
public static boolean isPrimitive(Object obj) {
boolean rv=obj.getClass().isPrimitive() || obj instanceof String || obj instanceof Integer || obj instanceof Long || obj instanceof Byte || obj instanceof Character || obj instanceof Boolean
|| obj instanceof Short || obj instanceof Float || obj instanceof Double || obj instanceof BigDecimal || obj instanceof BigInteger;
return rv;
}
/**
* 把Bean转换为字符串
* @param obj Object
* @return String String
*/
@SuppressWarnings("rawtypes")
public static String toString(Object obj) {
if(obj == null) {
return "null";
}
Class cl=obj.getClass();
if(isPrimitive(obj)) {
return String.valueOf(obj);
} else if(obj instanceof Enum) {
return ((Enum)obj).name();
} else if(obj instanceof Date) {
return String.valueOf(((Date)obj).getTime());
} else if(obj instanceof Calendar) {
return String.valueOf(((Calendar)obj).getTime().getTime());
} else if(cl.isArray()) {
String r="[";
int len=Array.getLength(obj);
for(int i=0; i < len; i++) {
if(i > 0) {
r+=",";
}
Object val=Array.get(obj, i);
r+=toString(val);
}
return r + "]";
} else if(obj instanceof Collection) {
Collection tempCol=(Collection)obj;
Iterator it=tempCol.iterator();
String r="[";
for(int i=0; it.hasNext(); i++) {
if(i > 0) {
r+=",";
}
Object val=it.next();
r+=toString(val);
}
return r + "]";
} else if(obj instanceof Map) {
Map tempMap=(Map)obj;
String r="{";
Iterator it=tempMap.entrySet().iterator();
while(it.hasNext()) {
Map.Entry entry=(Entry)it.next();
Object key=entry.getKey();
r+=toString(key);
r+="=";
Object val=entry.getValue();
r+=toString(val);
if(it.hasNext()) {
r+=",";
}
}
return r + "}";
} else if(obj instanceof Class) {
Class tmpCls=(Class)obj;
return tmpCls.getName();
}
String r=cl.getName();
do {
Field[] fields=fieldsCahce.get(cl);
if(null == fields) {
fields=cl.getDeclaredFields();
if(null != fields) {
AccessibleObject.setAccessible(fields, true);
}
fieldsCahce.put(cl, fields);
}
if(null == fields || fields.length == 0) {
cl=cl.getSuperclass();
continue;
}
r+="[";
// get the names and values of all fields
for(Field f: fields) {
if(Modifier.isStatic(f.getModifiers())) {
continue;
}
if(f.isSynthetic() || f.getName().indexOf("this$") != -1) {
continue;
}
r+=f.getName() + "=";
try {
Object val=f.get(obj);
r+=toString(val);
} catch(Exception e) {
e.printStackTrace();
}
r+=",";
}
if(r.endsWith(",")) {
r=r.substring(0, r.length() - 1);
}
r+="]";
cl=cl.getSuperclass();
} while(cl != null);
return r;
}
}