Skip to content

Instantly share code, notes, and snippets.

@dariodariodario
Last active December 22, 2022 10:44
Show Gist options
  • Save dariodariodario/0ebf3bd602766d723c5ce633f5ac4a33 to your computer and use it in GitHub Desktop.
Save dariodariodario/0ebf3bd602766d723c5ce633f5ac4a33 to your computer and use it in GitHub Desktop.
Handy pretty printer
package com.dariodario.experiments;
import java.lang.reflect.Field;
import java.lang.reflect.InaccessibleObjectException;
import java.util.Collection;
import java.util.Map;
import org.apache.commons.lang3.reflect.FieldUtils;
/* Pretty printer I created on the fly for testing purposes, it recursively prints an object hierarchy by showing the fields, all of them. Won't handle circular references. Java 17, Commons Lang 3 */
public class PrettyPrint {
public static String print(Object obj) {
StringBuilder builder = new StringBuilder();
String spacing = "";
innerPrint(obj, spacing, builder, false);
return builder.toString();
}
private static void innerPrint(Object obj, String spacing, StringBuilder builder, boolean keepIndent) {
if (keepIndent){
builder.append(spacing + obj.getClass().getSimpleName() + " {\n");
}else {
builder.append(obj.getClass().getSimpleName() + " {\n");
}
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
try {
Object value = FieldUtils.readField(field, obj, true);
String fieldString = spacing + " - " + field.getName();
String fieldIndent = " ".repeat(fieldString.length());
builder.append(fieldString + ": ");
if (field.getType().isEnum()) {
builder.append(value.toString());
} else {
switch (value) {
case null -> builder.append("null");
case Boolean b -> builder.append(b);
case String str -> builder.append("\"" + str + "\"");
case Integer n -> builder.append(n);
case Collection list -> {
builder.append("[\n");
for (Object item : list) {
innerPrint(item, " " + spacing, builder, true);
builder.append("\n");
}
builder.append(spacing + " " + "]");
}
case Map map -> {
builder.append("{\n");
for (Object k : map.keySet()) {
String mapField = k.toString() + ": ";
String mapFieldIndent = " ".repeat(mapField.length());
builder.append(fieldIndent + " " + mapField);
innerPrint(map.get(k), fieldIndent + mapFieldIndent + " " , builder, false);
builder.append("\n");
}
builder.append(" " + spacing + "}");
}
default -> {
if (field.getType().isPrimitive()) {
builder.append(value.toString());
}
innerPrint(value, spacing + " ", builder, false);
}
}
}
builder.append("\n");
} catch (IllegalAccessException e) {
builder.append(spacing + field.getName() + ": ???\n");
} catch (InaccessibleObjectException e) {
builder.append(spacing + field.getName() + ": ???\n");
}
}
if (keepIndent) {
builder.append(spacing + "}");
}else{
int adjust = Math.max(0, spacing.length() - obj.getClass().getSimpleName().length());
builder.append(spacing + "}");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment