如何计算方法的调用?

时间:2019-05-27 14:22:27

标签: java java-ee interceptor

使用拦截器计算调用次数。

我用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 个答案:

答案 0 :(得分:1)

只需将字段初始化为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);

   }

}

答案 1 :(得分:0)

您可以使用映射保存方法名称和该方法的调用次数。

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

}