【问题标题】:Invoke of a method - logging as method declaring class调用方法 - 记录为方法声明类
【发布时间】:2018-12-10 10:28:51
【问题描述】:

我目前正在使用 JBoss 拦截器和代理类来包装在运行时调用的方法并记录一些统计信息。

这么说,有这个代码:

public class ProxyLoggingInterceptor <T> implements InvocationHandler {

private Logger logger = LoggerFactory.getLogger(ProxyLoggingInterceptor.class);


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        logger.info("%s.%s", t.getClass().getSimpleName(), method.getName());
    }
}

日志会产生如下内容:

12-11-2018 11:41.09,728 INFO (ProxyLoggingInterceptor) - [ANALYTICS]: MyClass.myMethod

但是,我想将日志记录声明类显示为记录器条目,即 MyClass。 期望的结果是这样的:

12-11-2018 11:41.09,728 INFO (MyClass) - [ANALYTICS]: MyClass.myMethod

有什么方法不会被认为是不好的做法吗?

【问题讨论】:

    标签: java logging aop


    【解决方案1】:

    其实我并不喜欢基于动态代理的AOP,我总是使用AspectJ,在这种情况下不存在这种问题并且很容易得到你想要的信息,因为原来的类被修改了。但无论如何,由于它的 aop 标签找到了这个问题并且玩了一点,我试图回答它:

    package de.scrum_master.app;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.Map;
    import java.util.function.Function;
    
    public class ProxyLoggingInterceptor<T> implements InvocationHandler {
      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.printf(
          "%s.%s%n",
          proxy.getClass().getGenericInterfaces()[0].getTypeName(),
          method.getName()
        );
        return null;
      }
    
      public static void main(String[] args) {
        ClassLoader classLoader = ProxyLoggingInterceptor.class.getClassLoader();
    
        Map mapProxy = (Map) Proxy.newProxyInstance(
          classLoader,
          new Class[] { Map.class },
          new ProxyLoggingInterceptor<Map>()
        );
        mapProxy.put("foo", 11);
    
        Function functionProxy = (Function) Proxy.newProxyInstance(
          classLoader,
          new Class[] { Function.class },
          new ProxyLoggingInterceptor<Function>()
        );
        functionProxy.apply("x");
    
        Runnable runnableProxy = (Runnable) Proxy.newProxyInstance(
          classLoader,
          new Class[] { Runnable.class },
          new ProxyLoggingInterceptor<Runnable>()
        );
        runnableProxy.run();
      }
    }
    

    控制台输出:

    java.util.Map.put
    java.util.function.Function.apply
    java.lang.Runnable.run
    

    这是你想要的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 2013-11-09
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多