package com.tool.common.log.util;
import com.tool.common.log.log.LogConstant;
import com.tool.common.log.log.LogConfig;
import com.tool.common.log.log.parser.Parser;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
/**
* ObjectUtil
*/
public class ObjectUtil {
public ObjectUtil() {
throw new AssertionError();
}
/**
* Object to String
*
* @param object
* @return
*/
public static String objectToString(Object object) {
return objectToString(object, 0);
}
/**
* 是否为静态内部类
*
* @param cls
* @return
*/
private static boolean isStaticInnerClass(Class cls) {
if (cls != null && cls.isMemberClass()) {
int modifiers = cls.getModifiers();
if ((modifiers & Modifier.STATIC) == Modifier.STATIC) {
return true;
}
}
return false;
}
/**
* Object to String
*
* @param object
* @param childLevel
* @return
*/
private static String objectToString(Object object, int childLevel) {
if (object == null) {
return LogConstant.NULL;
}
if (childLevel > LogConstant.MAX_LEVEL) {
return object.toString();
}
//自定义解析类判断
for (Parser parser : LogConfig.getConfig().getParsers()) {
if (parser.parseClassType().isAssignableFrom(object.getClass())) {
return parser.parseString(object);
}
}
//是否是数组
if (ArrayUtil.isArray(object)) {
return ArrayUtil.parseArray(object);
}
if (object.toString().startsWith(object.getClass().getName() + "@")) {
StringBuilder builder = new StringBuilder();
iterateClassFields(object.getClass(), builder, object, false, childLevel);
Class superClass = object.getClass().getSuperclass();
while (!superClass.equals(Object.class)) {
iterateClassFields(superClass, builder, object, true, childLevel);
superClass = superClass.getSuperclass();
}
return builder.toString();
}
return object.toString();
}
/**
* 拼接字段和值
*
* @param cla
* @param builder
* @param o 对象
* @param isSubClass 是否为子class
* @param childOffset 递归解析属性的层级
*/
private static void iterateClassFields(Class cla, StringBuilder builder, Object o, boolean isSubClass,
int childOffset) {
if (cla.equals(Object.class)) {
return;
}
if (isSubClass) {
builder.append(LogConstant.BR + "=> ");
}
String breakLine = "";
builder.append(" " + cla.getSimpleName() + " {");
Field[] fields = cla.getDeclaredFields();
for (int i = 0; i < fields.length; ++i) {
Field field = fields[i];
field.setAccessible(true);
if (cla.isMemberClass() && !isStaticInnerClass(cla) && i == 0) {
continue;
}
Object subObject = null;
try {
subObject = field.get(o);
} catch (IllegalAccessException e) {
subObject = e;
} finally {
if (subObject != null) {
// 解决Instant Run情况下内部类死循环的问题
if (!isStaticInnerClass(cla) && (field.getName().equals("$change") || field.getName().equalsIgnoreCase("this$0"))) {
continue;
}
if (subObject instanceof String) {
subObject = "\"" + subObject + "\"";
} else if (subObject instanceof Character) {
subObject = "\'" + subObject + "\'";
}
if (childOffset < LogConstant.MAX_LEVEL) {
subObject = objectToString(subObject, childOffset + 1);
}
}
String formatString = breakLine + "%s = %s, ";
builder.append(String.format(formatString, field.getName(), subObject == null ? "null" : subObject.toString()));
}
}
if (builder.toString().endsWith("{")) {
builder.append("}");
} else {
builder.replace(builder.length() - 2, builder.length() - 1, breakLine + "}");
}
}
}