package com.xiongyingqi.util;
import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.text.MessageFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by 瑛琪<a href="http://xiongyingqi.com">xiongyingqi.com</a> on 2014/9/17 0017.
*/
public class PrintHelper {
private Map<String, String> commentMap;
private Collection<String> ignoreProperties;
private String commentPattern = "{0}<{1}>";
private String ignorePattern = "({0}=.*?,\\s*)|({0}=.*?])";
private Pattern pattern = Pattern.compile("password=.*((,\\s)|])*");
public static PrintHelper needComment() {
PrintHelper printHelper = new PrintHelper();
printHelper.commentMap = new HashMap<String, String>();
printHelper.ignoreProperties = new ArrayList<String>();
return printHelper;
}
public PrintHelper addComment(String word, String comment) {
commentMap.put(word, comment);
return this;
}
public PrintHelper ignoreProperty(String propertyName) {
ignoreProperties.add(propertyName);
return this;
}
private String buildContent(String content) {
Set<Map.Entry<String, String>> entries = commentMap.entrySet();
StringBuilder builder = new StringBuilder(content);
// for (String ignoreProperty : ignoreProperties) {
// handleIgnoreProperty(builder, ignoreProperty);
// }
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
replaceWord(builder, key, value);
}
return builder.toString();
}
private void handleIgnoreProperty(StringBuilder builder, String propertyName) {
String s = builder.toString();
String patternStr = MessageFormat.format(ignorePattern, propertyName);
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(builder);
while (matcher.find()) {
s = matcher.replaceAll("");
}
builder.replace(0, builder.length(), s);
}
private String buildWordAndComment(String word, String comment) {
String rs = MessageFormat.format(commentPattern, word, comment);
return rs;
}
private void replaceWord(StringBuilder builder, String word, String comment) {
String replacement = buildWordAndComment(word, comment);
int fromIndex = 0;
int index;
while ((index = builder.indexOf(word, fromIndex)) > 0) {
fromIndex = index + 1;
builder.replace(index, index + word.length(), replacement);
}
}
/**
* 打印对象同时加入注释
*
* @param object
*/
public void printC(Object object) {
StackTraceElement[] stackTraceElements = StackTraceHelper.getStackTrace();
StackTraceElement stackTraceElement = stackTraceElements[2]; // 调用本类的对象类型堆栈
StringBuilder builder = new StringBuilder();
builder.append(" ------------------------------------------------------------ ");
builder.append(StringHelper.line());
builder.append(StackTraceHelper
.buildStackTrace(new StackTraceElement[]{stackTraceElement}));
builder.append(" ");
if (object == null) {
builder.append("<null>");
} else {
builder.append(object.getClass().getSimpleName());
builder.append(" =============== ");
String content = buildObjectToString(object);
builder.append(buildContent(content));
}
builder.append(StringHelper.line());
builder.append(" ------------------------------------------------------------ ");
System.out.println(builder.toString());
}
private String buildObjectToString(Object object) {
if (object == null) {
return null;
}
Class clazz = object.getClass();
StringBuilder builder = new StringBuilder();
if (clazz.isArray()) {
builder.append("[");
int length = Array.getLength(object);
for (int i = 0; i < length; i++) {
Object one = Array.get(object, i);
builder.append(buildObjectToString(one));
if (i < length - 1) {
builder.append(", ");
}
}
builder.append("]");
// } else if (clazz.getSuperclass() == Collection.class) {
// builder.append("[");
// Collection collection = (Collection) object;
//
// int i = 0;
// int length = collection.size();
// for (Object o : collection) {
// builder.append(buildObjectToString(o));
// if (i < length - 1) {
// builder.append(", ");
// }
// }
// builder.append("]");
} else {
builder.append(reflectToString(object));
}
return builder.toString();
}
/**
* 使用反射机制自动ToString <br>
* 2013-8-28 下午3:16:40
*
* @param object
* @return
*/
public String reflectToString(Object object) {
if (object == null) {
return null;
}
Class clazz = object.getClass();
StringBuilder builder = new StringBuilder(clazz.getName());
builder.append("@");
builder.append(Integer.toHexString(object.hashCode()));
builder.append("[");
Set<Method> methods = new LinkedHashSet<Method>();
Collection<Class> classes = EntityHelper.getAllSuperClassesOfClass(clazz);
for (Iterator iterator = classes.iterator(); iterator.hasNext(); ) {
Class claxx = (Class) iterator.next();
Method[] clazzMethods = claxx.getDeclaredMethods();
for (int i = 0; i < clazzMethods.length; i++) {
Method method = clazzMethods[i];
methods.add(method);
}
}
// for (int i = 0; i < methods.length; i++) {
// Method method = methods[i];
for (Iterator iterator = methods.iterator(); iterator.hasNext(); ) {
Method method = (Method) iterator.next();
String methodName = method.getName();
if (methodName.startsWith("get") && !Modifier.isStatic(method.getModifiers())
&& Modifier.isPublic(method.getModifiers())) {
try {
Object value = method.invoke(object);
String propertyName = methodName.substring(3, 4).toLowerCase()
+ methodName.substring(4);
if (propertyName.equals("class") || ignoreProperties.contains(propertyName)) {// 忽略getClass方法
continue;
}
builder.append(propertyName);
builder.append("=");
if (value == null) {
builder.append("<null>");
} else {
if (value.getClass().isArray()) {
int arraySuperLength = Array.getLength(value);
builder.append("{");
for (int j = 0; j < arraySuperLength; j++) {
Object object2 = Array.get(value, j);
builder.append(object2.toString());
if (j < arraySuperLength - 1) {
builder.append(", ");
}
}
builder.append("}");
} else {
builder.append(value.toString());
}
}
builder.append(", ");
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
}
}
if (builder.toString().contains(", ")) {
builder.replace(builder.length() - 2, builder.length(), "");
}
builder.append("]");
return builder.toString();
}
/**
* 打印对象详情 <br>
* 2013-8-26 下午2:45:02
*
* @param object
*/
public static void printDetail(Object object) {
StackTraceElement[] stackTraceElements = StackTraceHelper.getStackTrace();
StackTraceElement stackTraceElement = stackTraceElements[2]; // 调用本类的对象类型堆栈
StringBuilder builder = new StringBuilder();
builder.append(" ------------------------------------------------------------ ");
builder.append(StringHelper.line());
builder.append(StackTraceHelper
.buildStackTrace(new StackTraceElement[]{stackTraceElement}));
builder.append(" ");
if (object == null) {
builder.append("<null>");
} else {
builder.append(object.getClass().getSimpleName());
builder.append(" =============== ");
builder.append(EntityHelper.reflectToString(object));
}
builder.append(StringHelper.line());
builder.append(" ------------------------------------------------------------ ");
System.out.println(builder.toString());
}
/**
* 打印对象, <br>
* 2013-8-26 下午2:45:02
*
* @param object
*/
public static void print(Object object) {
StackTraceElement[] stackTraceElements = StackTraceHelper.getStackTrace();
StackTraceElement stackTraceElement = stackTraceElements[2]; // 调用本类的对象类型堆栈
StringBuilder builder = new StringBuilder();
builder.append(" ------------------------------------------------------------ ");
builder.append(StringHelper.line());
builder.append(StackTraceHelper
.buildStackTrace(new StackTraceElement[]{stackTraceElement}));
builder.append(" ");
if (object == null) {
builder.append("<null>");
} else {
builder.append(object.getClass().getSimpleName());
builder.append(" =============== ");
builder.append(EntityHelper.buildObjectToString(object));
}
builder.append(StringHelper.line());
builder.append(" ------------------------------------------------------------ ");
System.out.println(builder.toString());
}
public static void print() {
StackTraceElement[] stackTraceElements = StackTraceHelper.getStackTrace();
StackTraceElement stackTraceElement = stackTraceElements[2]; // 调用本类的对象类型堆栈
StringBuilder builder = new StringBuilder();
builder.append(" ------------------------------------------------------------ ");
builder.append(StringHelper.line());
builder.append(StackTraceHelper
.buildStackTrace(new StackTraceElement[]{stackTraceElement}));
builder.append(" ");
builder.append(StringHelper.line());
builder.append(" ------------------------------------------------------------ ");
System.out.println(builder.toString());
}
}