Как я могу посчитать вызовы метода? - PullRequest
0 голосов
/ 27 мая 2019

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

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

}

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

Ответы [ 2 ]

1 голос
/ 27 мая 2019

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

   }

}

0 голосов
/ 27 мая 2019

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

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

}
...