import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Handler implements InvocationHandler {
private Object hidden;
public Handler(Object hidden) {
this.hidden = hidden;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long time = System.nanoTime();
System.out.print(hidden + ".".concat(method.getName()).concat("("));
for (int i = 0; i < args.length; i++) {
System.out.print(args[i]);
if (i != args.length - 1) {
System.out.print(", ");
}
}
System.out.println(")".concat(System.lineSeparator()));
Object object = method.invoke(hidden, args);
System.out.println("Time: ".concat(String.valueOf(System.nanoTime() - time).
concat(" ns").concat(System.lineSeparator())));
return object;
}
}