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');
+        }
+    }
+}