1. Разрешено ли спецификацией для компилятора Java генерировать поля, которые не определены в классе?
Да, хотя они должны быть помечены как синтетические . Синтетика включает средства доступа для внутренних классов (хотя эта реализация недавно изменилась), методы лямбда-выражений и, как мне кажется, конструкторы по умолчанию.
2. Почему ajc генерирует дополнительное поле? Какая-то оптимизация производительности?
Похоже, плохая оптимизация производительности. Возможно, это связано с эффективным добавлением аспектов.
3. Есть ли способ заставить ajc не генерировать дополнительное поле?
Понятия не имею. Вы должны ожидать, что синтетика будет генерироваться независимо.
4. В чем причина частной статики, влияющей на генерацию serialVersionUID?
Сериализация Java была создана в «Интернет время». Для совместимости мы оставляем все, что делала первая версия. Мораль: если ты что-то создаешь в Интернете, выбрось.
5. Знают ли разработчики aspectj об этом поведении? Если так, почему они все равно выбирают поле генерации?
Я бы на это надеялся. Ожидается, что компиляторы родят синтетику.
6. Есть ли гарантии того, что класс Java будет сериализован JLS?
Существует спецификация Java Serialization (хотя я не ожидаю, что многие ее прочитают).
7. Как сгенерированный Javac-код работает без этого поля?
Относительно легко увидеть, как можно написать строку включения без массива. Точные детали уродливой оптимизированной версии будут беспорядочными. Вы можете увидеть, что на самом деле происходит с javap -private -c
.
Заключение
Рекомендуется добавить serialVersionUID
, если предполагается, что данные будут использоваться между различными версиями класса. OTOH, также рекомендуется не использовать сериализацию Java.