Почему при обработке аннотаций процессор обрабатывает сгенерированный им файл, даже если этот файл не снабжен поддержива ⇐ 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

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