package com.softwaremill.common.debug.timing; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author Adam Warski (adam at warski dot org) */ public class TimingProxy { @SuppressWarnings({"unchecked"}) public static <T, U extends T> T createFor(final U instance, Class<T> _interface) { return (T) Proxy.newProxyInstance(instance.getClass().getClassLoader(), new Class[]{ _interface }, new InvocationHandler() { @SuppressWarnings({"unchecked"}) @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { long t0 = System.nanoTime(); try { return method.invoke(instance, args); } finally { long dt = System.nanoTime() - t0; TimingResults.instance.addInvocation(method, dt); } } }); } }