view test/java/dyn/MethodHandlePrinter.java @ 42:1abb32424461

More
author Gary Benson <gbenson@redhat.com>
date Mon, 28 Mar 2011 14:58:39 +0100
parents 75c08d56477b
children 67e51ee24c47
line wrap: on
line source

package test.java.dyn;

import java.dyn.MethodHandle;
import java.lang.reflect.Field;

public class MethodHandlePrinter {
    static void print(MethodHandle 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("}");
    }

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