que tienen un contador llamada a un objeto que básicamente es el siguiente:
private long count;
private long errors;
private long duration;
private long errorDuration;
Con dos métodos de "tiempo" para cronometrar métodos que devuelven algo y otros métodos que son nulas.
public <T> T time(ReturningRunnable<T> runnable) {
long start = currentTimeMillis();
T result = null;
try {
result = runnable.run();
} catch (Throwable ex) {
errorDuration += currentTimeMillis() - start;
errors++;
throw runtime(ex);
}
duration += currentTimeMillis() - start;
count++;
return result;
}
public void time(Runnable runnable) {
time(new RunnableRunner(runnable));
}
yo decidimos volver a lanzar las excepciones como excepciones de tiempo de ejecución (ya que no soy un fan de excepciones comprobadas) pero del mismo modo que podría hacer que su MyRunnable encargo excepciones tiro interfaz y simplemente coger y volver a lanzar ellos. Aquí hay un uso de lo anterior:
counter.time(new Runnable() {
@Override
public void run() {
// Do something
});
O esto, en el caso del valor de regresar:
return counter.time(new ReturningRunnable<Integer>() {
@Override
public Integer run() {
return 1; // You get the idea
});
me gusta esto porque mis objetos de contador pueden estar expuestos durante JMX y se inyecta donde los necesito. Podrías hacer lo que pediste con reflexión, pero creo que sería complicado (en mi humilde opinión).
Ver java.lang.reflect.Method. –