2012-02-04 1 views
4

Я пытаюсь сделать что-то очень простое. У меня есть класс com.mypackage.Logger 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, и каждая запись журнала отформатирован следующим образом:

[СЛЕД] (даты и времени) (протоколирование имя класса) (название нити) (некоторые каротаж заявление)

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

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

ответ

2

Это просто

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

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

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

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

Для каротажного материала, я сделал некоторые эксперименты с AspectJ с использованием модели instanciation & межтиповых деклараций. Я бы посоветовал реализации с использованием декларации межтипового, потому что это больше памяти экономия:

Logger injection with perthis

Logger injection with inter-type declaration