2010-02-09 3 views
1

Это мой первый вопрос, поэтому, пожалуйста, будьте осторожны. :-) Я знаю, что AspectJ может создавать pointcuts на статических инициализаторах java классов. Но вопрос, является ли статический инициализатор в Аспект, как показано ниже, гарантированно можно назвать только один раз:Являются ли статические инициализаторы гарантированными для аспектов AspectJ?

@Aspect 
public class MyAspect { 
    private static Map configuration; 
    static { 
    // Some initialization stuff 
    configuration = Config.getConfiguration(); 
    } 
    ... use the "configuration" map in pointcuts and advices 
} 

Другими словами, это аспект загружается как класс Java загружается? Это делается через ClassLoader? Я догадываюсь, да, и, похоже, это работает, но я ищу гарантию в этом направлении.

+1

Согласно ответу на список рассылки usersj-пользователей, Рамнивас Ладдад (автор прекрасной книги AspectJ In Action) говорит, что статические инициализаторы в аспектах ARE называются так же, как и для классов. – fool4jesus

ответ

1

AspectJ работает используя байткод модификация. Эта модификация может произойти замирание во время компиляции («компиляция во времени» или CTW) или во время загрузки («Время загрузки во времени» или LTW).

Если вы хотите быть уверенным, то я предлагаю вам использовать компилятор aspectj для выполнения CTW на вашем примере, а затем передать полученные файлы классов через инструмент javap (или что-то в этом роде), чтобы увидеть, что он фактически сгенерировал , Это должно дать вам уверенность в том, что это (или не) делает то, что вы думаете.

+0

Спасибо - и я знаю, что аспект в настоящее время реализован так же, как класс. Но документация, которую я видел, прилагает все усилия, чтобы сказать, что аспекты - это * не * классы, поэтому я искал авторитетное заявление, в котором говорится, что он всегда будет продолжать работать таким образом, а не только то, что он делает прямо сейчас. Что-то вроде «аспект AspectJ имеет тот же жизненный цикл, что и класс java». – fool4jesus

Смежные вопросы