Вызов метода - регистрация как метод, объявляющий класс - PullRequest
0 голосов
/ 12 ноября 2018

В настоящее время я использую перехватчики 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

Есть ли способ, который бы не считался плохой практикой?

1 Ответ

0 голосов
/ 10 декабря 2018

На самом деле я не в 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

Ты этого хочешь?

...