import java.lang.reflect.*;
class ClassInspector2
{
static int level = 0; // indentation depth
static final String indentString = " ";
static void indent()
{
for (int i = 0; i < level; ++i)
System.out.print(indentString);
}
static void indent(String s)
{
indent();
System.out.print(s);
}
public static void inspect(Class c)
{
if (level == 0)
{
// Get Package
Package pkg = c.getPackage();
if (pkg != null)
indent("package " + pkg.getName() + ";\n\n");
}
// Get Modifiers & Name
String mods = Modifier.toString(c.getModifiers());
indent();
if (mods.length() > 0)
System.out.print(mods + " ");
if (!c.isArray() && !c.isInterface() && !c.isPrimitive())
System.out.print("class ");
System.out.println(c.getName());
// Get Superclass
Class sup = c.getSuperclass();
if (sup != null)
{
++level;
indent("extends " + sup.getName() + "\n");
--level;
}
// Get Interfaces
Class[] interfaces = c.getInterfaces();
if (interfaces.length > 0)
{
++level;
for (int i = 0; i < interfaces.length; ++i)
indent("implements " + interfaces[i].getName() + "\n");
--level;
}
// Start of class definition body
indent("{\n");
// Get Fields
doFields(c);
// Get Constructors
doCtors(c);
// Get Methods
doMethods(c);
// Get Nested classes (recursive)
Class[] classes = c.getDeclaredClasses();
if (classes.length > 0)
{
++level;
indent("// Nested Classes\n");
for (int i = 0; i < classes.length; ++i)
inspect(classes[i]);
--level;
}
// End of class definition body
indent("}\n");
}
static void doCtors(Class c)
{
Constructor[] ctors = c.getDeclaredConstructors();
if (ctors.length == 0)
return;
++level;
indent("// Constructors\n");
for (int i = 0; i < ctors.length; ++i)
{
Constructor ctor = ctors[i];
String mods = Modifier.toString(ctor.getModifiers());
indent();
if (mods.length() > 0)
System.out.print(mods + " ");
System.out.print(ctor.getName() + "(");
// Print parameters
doParameters(ctor.getParameterTypes());
System.out.println(");");
}
System.out.println();
--level;
}
static void doFields(Class c)
{
Field[] fields = c.getDeclaredFields();
if (fields.length == 0)
return;
++level;
indent("// Fields\n");
for (int i = 0; i < fields.length; ++i)
{
Field fld = fields[i];
String type = fld.getType().getName();
String mods = Modifier.toString(fld.getModifiers());
indent();
if (mods.length() > 0)
System.out.print(mods + " ");
System.out.println(type + " " + fld.getName() +";");
}
System.out.println();
--level;
}
static void doMethods(Class c)
{
Method[] methods = c.getDeclaredMethods();
if (methods.length == 0)
return;
++level;
indent("// Methods\n");
for (int i = 0; i < methods.length; ++i)
{
Method m = methods[i];
Class retType = m.getReturnType();
String mods = Modifier.toString(m.getModifiers());
indent();
if (mods.length() > 0)
System.out.print(mods + " ");
System.out.print(retType.getName() + " " +
m.getName() + "(");
// Print parameters
doParameters(m.getParameterTypes());
System.out.println(");");
}
System.out.println();
--level;
}
static void doParameters(Class[] parms)
{
int nParms = parms.length;
for (int j = 0; j < nParms; ++j)
{
Class parmType = parms[j];
if (j > 0)
System.out.print(", ");
System.out.print(parmType.getName());
}
}
public static void main(String[] args)
throws ClassNotFoundException
{
inspect(Class.forName("java.util.TreeMap"));
}
}
End of Listing