/**
	Print the public fields and methods of the specified class (output similar 
	to the JDK javap command).
	<p/>
	If the argument is a string it is considered to be a class name.  If the
	argument is an object, the class of the object is used.  If the arg is a
	class, the class is used.  If the argument is a class identifier, the class
	identified by the class identifier will be used. e.g.  If the argument is
	the empty string an error will be printed.
	<p/>
	<pre>
	// equivalent
	javap( java.util.Date ); // class identifier
	javap( java.util.Date.class ); // class
	javap( "java.util.Date" ); // String name of class
	javap( new java.util.Date() ); // instance of class
	</pre>

	@method void javap( String | Object | Class | ClassIdentifier )
*/

bsh.help.javap= "usage: javap( value )";

import org.gjt.sp.jedit.bsh.ClassIdentifier;
import java.lang.reflect.Modifier;

javap( Object o ) 
{
	Class clas;
	if ( o instanceof ClassIdentifier )
		clas = this.caller.namespace.identifierToClass(o);
	else if ( o instanceof String )
	{
		if ( o.length() < 1 ) {
			error("javap: Empty class name.");
			return;
		}
		clas = this.caller.namespace.getClass((String)o);
	} else if ( o instanceof Class )
		clas = o;
	else 
		clas = o.getClass();
	
	print( "Class "+clas+" extends " +clas.getSuperclass() );

	this.dmethods=clas.getDeclaredMethods();
	//print("------------- Methods ----------------");
	for(int i=0; i<dmethods.length; i++) {
		this.m = dmethods[i];
		if ( Modifier.isPublic( m.getModifiers() ) )
			print( m );
	}

	//print("------------- Fields ----------------");
	this.fields=clas.getDeclaredFields();
	for(int i=0; i<fields.length; i++) {
		this.f = fields[i];
		if ( Modifier.isPublic( f.getModifiers() ) )
			print( f );
	}
}

