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);
}
}
}