AspectJ weaving: Как сделать полное переплетение кода без статической ссылки на аспект? - PullRequest
0 голосов
/ 20 апреля 2011

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

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

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

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

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

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

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

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

мартин

1 Ответ

2 голосов
/ 21 апреля 2011

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

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

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

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

...