Плетение AspectJ: как сделать полное переплетение кода без статической ссылки на аспект?

несколько недель назад я искал способ создать некоторые строковые константы для полей класса java -> Создать константы для атрибутов класса с помощью maven?

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

  1. Я удаляю файлы аспектов .class из клиентской банки во время процесса сборки.

  2. В их пути к классам нет библиотеки aspectj.

Используя декомпилятор, я обнаружил, что класс получил статический блок, подобный этому:

static {
CarDTOAspect.ajc$interFieldInit$my.package.CarDTOAspect$my.package.CarDTO$VENDOR(); 
CarDTOAspect.ajc$interFieldInit$my.package.CarDTOAspect$my.package.CarDTO$NAME();
}

Мой вопрос: есть ли опция в процедуре плетения, которая создает настоящее поле "public static final String" в моем файле класса, чтобы я мог полностью избавиться от аспектов в моем клиентском банке?

заранее спасибо

Мартин


person martin    schedule 20.04.2011    source источник


Ответы (1)


К сожалению нет. Это не то, для чего предназначен AspectJ. Объявления Intertype должны фактически жить в Aspect (со сгенерированной ссылкой в ​​целевом типе). Это связано с тем, что правила области действия могут разрешать добавление к целевому типу двух полей с одинаковыми именами. Например:

class C { }
aspect A1 { private int C.field = 9; }
aspect A2 { private String C.field = "what???"; }

Это полностью законно. Ни одно поле недоступно внутри C. Они доступны только внутри аспекта, который их объявляет.

Если вы хотите манипулировать байтовым кодом, я бы порекомендовал что-то вроде ASM или Javassist.

person Andrew Eisenberg    schedule 21.04.2011
comment
эй, спасибо, не ответ, который я ожидал, а объяснение =) Кажется, мне нужно заставить моих клиентов иметь зависимость от аспекта. - person martin; 27.04.2011