Как я могу подсчитать вызовы метода?

Используйте перехватчики для подсчета количества вызовов.

Я создал приложение с 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();
    }    

}

Как я могу добавить функцию для подсчета?

количество = количество + 1 ???

Antoniossss 27.05.2019 16:24

Мне нужно подсчитать количество раз для каждого метода, используя count ++, я получаю общее количество вызовов

Luiss.PEP 27.05.2019 16:30

Удерживайте Map<String, Integer> с именем метода в качестве ключа и счетчиком в качестве значения. Затем увеличьте счетчик, если метод введен. Может быть, одна карта на класс с методами этого класса. Вы можете предоставить другой метод, который выводит эту карту.

deHaar 27.05.2019 16:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
430
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Просто инициализируйте поле равным 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);

   }

}

Я не понимаю, как это сделать для нескольких методов. Что значит создать карту? Мне создать внешний класс с конструктором и методами для установки и восстановления счетчика мне?

Luiss.PEP 27.05.2019 16:41
Ответ принят как подходящий

Вы можете использовать карту для хранения имени метода и количества вызовов этого метода.

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();
    }

}

Другие вопросы по теме