view examples/util/ClassInfo.java @ 1:5df24c91468d

Oh my what a mess.
author samer
date Fri, 05 Apr 2019 16:26:00 +0100
parents bf79fb79ee13
children
line wrap: on
line source
package eg.util;
import  samer.core.*;
import  samer.core.shells.*;
import  samer.core.types.*;
import  samer.core.Agent.*;
import  java.lang.reflect.*;
import  java.util.*;

public class ClassInfo implements Agent, Observer
{
	VString	clname = new VString("class");
	VBoolean	all = new VBoolean("all",false);;
	Class		cl;

	public ClassInfo()
	{
		clname.addObserver(this);
		all.addObserver(this);
		Shell.register(this); 
		Shell.exposeCommands(this); 
	}

	public void getCommands(Registry r) { 
		r.add("class").add("interfaces")
			.add("methods").add("fields").add("superclass")
			.add("verbose", all.value);
	}

	public void execute(String cmd, Environment env) throws Exception
	{ 
		if (cmd.equals("class")) {
			clname.value = X.string(env.datum(),clname.value);
			clname.changed();
		} else if (cmd.equals("methods")) {
			Method		mths[];

			if (all.value) mths = cl.getMethods();
			else				mths = cl.getDeclaredMethods();
				
			Shell.print("Methods: ");
			for (int i=0;i<mths.length; i++) {
				Shell.print("\t"+mths[i]);
			}

		} else if (cmd.equals("fields")) {
			Field		flds[];

			if (all.value) flds = cl.getFields();
			else				flds = cl.getDeclaredFields();

			Shell.print("Fields: ");
			for (int i=0;i<flds.length; i++) {
				Shell.print("\t"+flds[i]);
			}
		} else if (cmd.equals("interfaces")) {
			Class		ifaces[] = cl.getInterfaces();
			Shell.print("Interfaces: ");
			for (int i=0;i<ifaces.length; i++) {
				Shell.print("\t"+ifaces[i]);
			}
		} else if (cmd.equals("superclass")) {
			setClass(cl.getSuperclass());
		} else if (cmd.equals("verbose")) {
			all.value = X._bool(env.datum(),!all.value);
			all.changed();
		}
	}

	public void update(Observable o, Object src)
	{
		if (clname.equals(o) && src!=this) { // &&&
			try { setClass(clname.value); }
			catch (Exception ex) {}
		}
	}

	private void setClass(String n) throws Exception {
		setClass(Class.forName(n));
	}

	private void setClass(Class c) throws Exception
	{
		clname.value = c.getName();
		clname.changed(this);
		cl = c; 

		Constructor cons[] = cl.getConstructors();

		Shell.print("\nClass: "+cl);
		Shell.print("\textends "+cl.getSuperclass());
		Shell.print("constructors");
		for (int i=0;i<cons.length; i++) {
			Shell.print("\t"+cons[i]);
		}
	}
}