Почему при обработке аннотаций процессор обрабатывает сгенерированный им файл, даже если этот файл не снабжен поддерживаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему при обработке аннотаций процессор обрабатывает сгенерированный им файл, даже если этот файл не снабжен поддержива

Сообщение Anonymous »

Мне хотелось бы понять поведение обработки аннотаций. В частности, у меня есть вопрос по поводу второго раунда сценария ниже. (Тогда у меня небольшой дополнительный вопрос о поведении компилятора.)
Предположим, мой очень простой процессор p0 поддерживает аннотацию @X. Предположим, что он вызывается в раунде 1 с помощью TypeElement, аннотированного @X. Предположим, что в результате он генерирует простой исходный файл Java, что приводит к предупреждению компилятора. Например:

Код: Выделить всё

package foo;
public class FooBecauseOfX {} // warning; implicit constructor
Других процессоров нет.
Я заметил, что (не считая виртуального нулевого раунда) существует три раунда обработки аннотаций. (Я наивно ожидал двух.)
Вот что происходит в раундах, и я пытаюсь понять это поведение во всей полноте:
(Первоначально: происходит «виртуальный» раунд 0, давая некоторые корневые элементы. Я это понимаю.)
Я понимаю раунд 1 из 3:
  • набор аннотаций @X, как и ожидалось ( находится в объекте, который он аннотирует)
  • набор корневых элементов (начиная с раунда 0) является надмножеством набора элемента аннотированного типа, как и ожидалось (есть и другие элементы, которые компилируются)
  • Код: Выделить всё

    roundEnvironment.getElementsAnnotatedWith(x)
    возвращает соответствующий TypeElement, как и ожидалось.
  • (p0 генерирует FooBecauseOfX.)
Раунд 2 из 3 удивил меня: p0 запрашивается на обработку еще раз, прежде чем обработка завершится, хотя больше ничего нет с аннотацией @X, включая FooBecauseOfX:
  • набор аннотаций пуст
  • набор корневых элементов равен FooBecauseOfX (только что написанный файл; обратите внимание, что он полностью не аннотирован)
  • очевидно, что теперь roundEnvironment.getElementsAnnotatedWith(x) возвращает пустой набор
Я понимаю, раунд 3 из 3: p0 снова просит выполнить своего рода обработку (для последнего раунда немного другие правила):
  • набор аннотаций пуст, как и ожидалось
  • набор корневых элементов пуст, как и ожидалось
  • Код: Выделить всё

    roundEnvironment.processingOver()
    возвращает true, как и ожидалось.
Досадно и несколько загадочно, что предупреждение компилятора, вызванное компиляцией по пути FooBecauseOfX, сгенерированное в конце раунда 1, выдается три раза.
Мои вопросы:
  • Почему p0 запрашивается на обработку во втором раунде? Сгенерированный файл вообще не имеет аннотаций, а также аннотаций, поддерживаемых p0. Я понимаю, что процессоры должны быть устойчивыми при наличии пустых наборов аннотаций; Я просто не понимаю, зачем вообще здесь задействован p0. Это потому, что если «процессору было предложено выполнить обработку в данном раунде, ему будет предложено выполнить обработку в последующих раундах, включая последний раунд, даже если для обработки нет аннотаций»?
  • (В основном просто раздражает.) Есть ли какой-нибудь способ избежать того, чтобы компилятор выплеснул предупреждение три раза? Я удивлен, что предупреждение появляется три раза, учитывая, что файл создается в первом раунде.


Подробнее здесь: https://stackoverflow.com/questions/799 ... -generated
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»