Mercurial > hg > shark
changeset 42:1abb32424461
More
author | Gary Benson <gbenson@redhat.com> |
---|---|
date | Mon, 28 Mar 2011 14:58:39 +0100 |
parents | 75c08d56477b |
children | 67e51ee24c47 |
files | test/java/dyn/MethodHandlePrinter.java |
diffstat | 1 files changed, 57 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/test/java/dyn/MethodHandlePrinter.java Mon Mar 28 14:43:32 2011 +0100 +++ b/test/java/dyn/MethodHandlePrinter.java Mon Mar 28 14:58:39 2011 +0100 @@ -1,9 +1,64 @@ package test.java.dyn; import java.dyn.MethodHandle; +import java.lang.reflect.Field; public class MethodHandlePrinter { static void print(MethodHandle mh) { - System.out.println(mh); + StringBuilder builder = new StringBuilder(); + formatObject(builder, mh, ""); + System.out.println(builder.toString()); + } + + private static void formatObject(StringBuilder builder, + Object obj, + String indent) { + Class klass = obj.getClass(); + builder.append(indent); + builder.append(klass.getName()); + builder.append(" {\n"); + formatFields(builder, obj, klass, indent + " "); + builder.append(indent); + builder.append("}"); } -} \ No newline at end of file + + private static void formatFields(StringBuilder builder, + Object obj, + Class klass, + String indent) { + Class parent = klass.getSuperclass(); + if (parent != Object.class) { + formatFields(builder, obj, parent, indent); + builder.append("\n"); + } + + builder.append(indent); + builder.append(klass.getName()); + builder.append(":\n"); + + for (Field field: klass.getDeclaredFields()) { + String name = field.getName(); + Object value; + try { + if (!field.isAccessible()) + field.setAccessible(true); + value = field.get(obj); + } + catch (Exception e) { + throw new RuntimeException(e); + } + + Class type = field.getType(); + String typeName = type.getName(); + + builder.append(indent); + builder.append(typeName); + builder.append(' '); + builder.append(name); + builder.append(" = "); + builder.append(value); + + builder.append('\n'); + } + } +}