package samples.tracing; import net.sf.cglib.proxy.MethodProxy; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.Enhancer; /** * This class is taken from the regular cglib samples. */ public class Trace implements MethodInterceptor { public static class Target { static int s_count = 0; private int m_count; public Target() { m_count = s_count++; } public void step1() { step2(new Target()); } public void step2(Target arg) { step3(); } public void step3() { } public String toString() { return "I am Target " + m_count; } } int ident = 1; static Trace callback = new Trace(); public static Object newInstance(Class clazz) { try { Enhancer e = new Enhancer(); e.setSuperclass(clazz); e.setCallback(callback); return e.create(); } catch (Throwable e) { e.printStackTrace(); throw new Error(e.getMessage()); } } public static void main(String[] args) { Target target = (Target) newInstance(Target.class); target.step1(); } public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args, MethodProxy proxy) throws Throwable { printIdent(ident); System.out.println(method); for (int i = 0; i < args.length; i++) { printIdent(ident); System.out.print("arg" + (i + 1) + ": "); if (obj == args[i]) { System.out.println("this"); } else { System.out.println(args[i]); } } ident++; Object retValFromSuper = null; try { retValFromSuper = proxy.invokeSuper(obj, args); ident--; } catch (Throwable t) { ident--; printIdent(ident); System.out.println("throw " + t); System.out.println(); throw t.fillInStackTrace(); } printIdent(ident); System.out.print("return "); if (obj == retValFromSuper) { System.out.println("this"); } else { System.out.println(retValFromSuper); } if (ident == 1) { System.out.println(); } return retValFromSuper; } void printIdent(int ident) { while (--ident > 0) { System.out.print("......."); } System.out.print(" "); } private Trace() { } }