Используйте перехватчики для подсчета количества вызовов.
Я создал приложение с java ee, состоящее из стороны ejb и клиента. Теперь мне нужно подсчитать, сколько раз клиент вызывает метод для каждого метода, используя перехватчики.
Я не понимаю, как изменить класс перехватчиков. Это мой код.
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class InterceptorsBean {
@AroundInvoke
public Object methodInterceptors (InvocationContext ctx) throws Exception {
System.out.println("Method invocated: " + ctx.getMethod().getName());
return ctx.proceed();
}
}
Как я могу добавить функцию для подсчета?
Мне нужно подсчитать количество раз для каждого метода, используя count ++, я получаю общее количество вызовов
Удерживайте Map<String, Integer>
с именем метода в качестве ключа и счетчиком в качестве значения. Затем увеличьте счетчик, если метод введен. Может быть, одна карта на класс с методами этого класса. Вы можете предоставить другой метод, который выводит эту карту.
Просто инициализируйте поле равным 0, а затем увеличивайте его всякий раз, когда вводится метод.
Если метод статический, сделайте его статическим полем.
И сделайте переменную частной и используйте экземпляр или статический метод для ее извлечения. Это делается для того, чтобы другие, кто может вызвать метод, не могли изменить переменную.
Если вы хотите сделать это для нескольких методов, используйте карту и используйте имя метода в качестве ключа для получения соответствующего счетчика.
public class MapCounterDemo {
private Map<String, Integer> counters = new HashMap<>();
public static void main(String[] args) {
MapCounterDemo demo = new MapCounterDemo();
demo.foo();
demo.foo();
demo.foo();
demo.bar();
demo.bar();
System.out.println(demo.counters);
}
public void foo() {
update("foo");
}
public void bar() {
update("bar");
}
private void update(String method) {
counters.compute(method,
(k, v) -> v == null ? 1
: ++v);
}
}
Я не понимаю, как это сделать для нескольких методов. Что значит создать карту? Мне создать внешний класс с конструктором и методами для установки и восстановления счетчика мне?
Вы можете использовать карту для хранения имени метода и количества вызовов этого метода.
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import java.util.Map;
public class InterceptorsBean {
private Map<String, Integer> numberOfInvocations;
@AroundInvoke
public Object methodInterceptors (InvocationContext ctx) throws Exception {
int invocations = 1;
if (numberOfInvocations.containsKey(ctx.getMethod().getName())) {
invocations = numberOfInvocations.get(ctx.getMethod().getName()) + 1;
}
numberOfInvocations.put(ctx.getMethod().getName(), invocations);
System.out.println("Method invocated: " + ctx.getMethod().getName());
System.out.println("Number of invocations: " + invocations);
return ctx.proceed();
}
}
количество = количество + 1 ???