Как установить статическую переменную в каждом классе? - PullRequest
4 голосов
/ 04 февраля 2012

Я пытаюсь сделать что-то очень простое.У меня есть класс логгера com.mypackage.Logger, оператор экземпляра которого я хотел бы «вставить» в каждый отдельный класс следующим образом: private static Logger LOG = new Logger(Class.class).Затем я хотел бы регистрировать каждую запись и выход для каждой отдельной функции в моем проекте.Вот мой аспект:

public aspect LoggingAspect pertypewithin(*) {

   private static Logger LOG;

   pointcut classes(): within(com.mypackage..*) && !within(com.mypackage.Logger) && !within(com.mypackage.LoggingAspect);
   pointcut functions(): classes() && (execution(* *(..)) || execution(new(..)));

   before(): staticinitialization(*) && classes() {
      LOG = new Logger(thisJoinPointStaticPart.getSignature().getDeclaringType());
   }

   before() : functions() {
      LOG.trace("ENTER " + thisJoinPoint.getSignature().toLongString());
   }


   after() returning(@SuppressWarnings("unused") Object ret) : functions() {
      LOG.trace("EXIT " + thisJoinPoint.getSignature().toLongString());
   }

Почти все работает правильно.Я получаю правильный вход и существующие отчеты журнала точно так, как ожидалось.Проблема в том, что класс журналирования, связанный с каждой записью журнала, неверен.Я использую log4j, и каждая запись в журнале форматируется следующим образом:

[TRACE] (отметка даты и времени) (имя класса ведения журнала) (имя потока) (некоторые инструкции ведения журнала)

Проблема в том, что класс ведения журнала, используемый при создании экземпляра Logger, не соответствует правильному классу, указанному thisJoinPoint.getSignature().getDeclaringTypeName().

Я знаю, что не правильно что-то делаю в отношении статическогоПеременная логгер, поэтому, пожалуйста, помогите мне.спасибо за ваше время !!!

1 Ответ

2 голосов
/ 08 февраля 2012

Все просто

Ваш атрибут LOG определен как приватный статический . Статический означает, что это атрибут класса , а не атрибут экземпляра.

Это явно противоречит модели инстанцирования вашего аспекта, которая равна pertypewithin (один экземпляр аспекта создан для каждого типа).

Попробуйте удалить статический модификатор.

Кстати, определение pertypewithin () * довольно большое, вы можете ограничить совпадение с помощью pertypewithin (classes ())

Что касается журналирования, я провел несколько экспериментов с AspectJ, используя модель реализации и объявления между типами. Я бы посоветовал реализацию с использованием объявления между типами, потому что это больше экономит память:

Логгер впрыск с пертисом

Внедрение логгера с декларацией типа

...