# HG changeset patch # User Gary Benson # Date 1301320719 -3600 # Node ID 1abb3242446174dabc06d332792dc84c843323ea # Parent 75c08d56477b075ed778d233c2bc55ffb8c795dd More diff -r 75c08d56477b -r 1abb32424461 test/java/dyn/MethodHandlePrinter.java --- 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'); + } + } +}