Interceptando métodos no Java

From Basef
Jump to: navigation, search

Para interceptar a chamada de um método, antes e depois, o seguinte esquema pode ser utilizado:

1) Criar uma classe interceptor:

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
 
public class ExecutionTimeInterceptor {
    @AroundInvoke
    public Object invoke(InvocationContext context) throws Exception {
        String methodName = context.getMethod().getName();
        String className = context.getTarget().getClass().getName();
        long timeBefore = System.currentTimeMillis();
 
        try {
            return context.proceed();
        } finally {
            long timeAfter = System.currentTimeMillis();
            long timeDiff = timeAfter - timeBefore;
            System.out.println("[ExecutionTimeInterceptor]: " + className + "::" + methodName + ": time " + timeDiff);
        }
    }
}

2) Utilizar a anotação no método desejado:

import javax.interceptor.Interceptors;
public myClass {
    @Interceptors(ExecutionTimeInterceptor.class)
    public void myMethod() {
 
    }
}