
import java.lang.reflect.*;

class ClassDump
{

        public static String dumpClassByName(String name)
        {
        try
        {
        return dumpClass(Class.forName(name));
        }
        catch (Exception e)
        {
        System.out.println("Exception: " + e);
        return null;
        }
        }



        public static String dumpClass(Class c)
        {

        String retval = null;
        try
        {

        retval = "Name: " + c.getName() + "\n";
        Class [] array = c.getInterfaces();
        retval += "\nInterfaces:\n";
        retval += dumpClassArray(array);
        array = c.getClasses();
        retval += "\nClasses:\n";
        retval += dumpClassArray(array);
        retval += "\nFields:\n";
        Field[] f = c.getFields();
        retval += dumpFields(f);
        retval += "\nMethods:\n";
        Method[] m = c.getMethods();
        retval += dumpMethods(m);
        retval += "\nConstructors:\n";
        Constructor[] co = c.getConstructors();
        retval += dumpConstructors(co);

        return retval;

        }
        catch (Exception e)
        {
        System.out.println("Exception : " + e);
        return null;
        }

        }
        public static String dumpClassArray(Class[] array)
        {
                String retval = null;
                int i;
                for (i = 0; i < array.length; i++)
                {
                if (retval == null)
                        {
                        retval = dumpClass(array[i]);
                        }
                else
                        {
                        retval += dumpClass(array[i]);
                        }
                }
                return retval;
        }

        public static String dumpFields(Field[] array)
        {
                String retval = null;
                int i;
                for (i = 0; i < array.length; i++)
                {
                        if (retval == null)
                                {
                                retval = dumpField(array[i]);
                                }
                        else
                                {
                                retval += dumpField(array[i]);
                                }

                }
                return retval;
        }

        public static String dumpField(Field f)
        {
                return f.toString() + "\n";
        }


        public static String dumpMethods(Method[] array)
        {
                int i;
                String retval = null;
                for (i = 0; i < array.length; i++)
                {
                if (retval == null)
                        {
                        retval = dumpMethod(array[i]);
                        }
                else
                        {
                        retval += dumpMethod(array[i]);
                        }


                }
                return retval;
        }

        public static String dumpMethod(Method m)
        {
                return m.toString() + "\n";
        }

        public static String dumpConstructors(Constructor[] array)
        {
                String retval = null;
                int i;
                for (i = 0; i < array.length; i++)
                {
                if (retval == null)
                        {
                        retval = dumpConstructor(array[i]);
                        }
                else
                        {
                        retval += dumpConstructor(array[i]);
                        }

                }
                return retval;
        }

        public static String dumpConstructor(Constructor c)
        {
                return c.toString() + "\n";
        }

        public static void main(String[] argv)
        {
        if (argv.length != 1)
                {
                System.out.println("usage: java ClassDump <classname>");
                return;
                }

        System.out.println(ClassDump.dumpClassByName(argv[0]));
        }
}
