Last active
December 22, 2022 10:44
-
-
Save dariodariodario/0ebf3bd602766d723c5ce633f5ac4a33 to your computer and use it in GitHub Desktop.
Handy pretty printer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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