import java.lang.reflect.*; /** * QuarkTrace is a dynamic proxy that adds method call tracing to anything that * looks like a Quark (implements IQuark). * * @author Thornton Rose */ public class QuarkTrace implements InvocationHandler { private Object realQuark; // QuarkTrace(Object): /** * Create a new QuarkTrace for the given object. */ public QuarkTrace(Object aQuark) { realQuark = aQuark; } // InvocationHandler ------------------------------------------------------- // invoke(Object, Method, Object[]): /** * Print method name, then invoke method on * instance of Quark that is being traced. */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("[" + method.getName() + "()]"); return method.invoke(realQuark, args); } // main -------------------------------------------------------------------- public static void main(String[] args) { Class quarkClass; IQuark quark; try { // Load class. quarkClass = Class.forName(args[0]); // Create proxy object. quark = (IQuark) Proxy.newProxyInstance( quarkClass.getClassLoader(), new Class[] { IQuark.class }, new QuarkTrace(quarkClass.newInstance()) ); // Call some methods. quark.setFlavor("bubblegum"); System.out.println("flavor = " + quark.getFlavor()); quark.spin(); } catch(Throwable t) { System.out.println(t); } } }