Processor — 어노테이션 프로세서 인터페이스

Processor — 어노테이션 프로세서 인터페이스

Processor는 어노테이션 프로세서를 위한 인터페이스예요. 어노테이션 처리는 일련의 라운드(round)로 진행돼요. 각 라운드마다 프로세서는 이전 라운드가 만든 소스·클래스 파일에서 발견된 어노테이션의 일부를 처리하도록 요청받을 수 있어요. 첫 라운드의 입력은 도구 실행의 초기 입력이며, 이 입력을 가상의 0번째 라운드 출력으로 볼 수 있어요.

프로세서가 특정 라운드에서 처리하도록 요청받았다면, 이후 라운드(마지막 라운드 포함)에서도 처리할 어노테이션이 없더라도 계속 요청받아요. 도구 인프라는 프로세서가 도구 작동으로 암묵적으로 생성된 파일을 처리하도록 요청할 수도 있어요. Processor의 모든 구현은 도구가 프로세서를 인스턴스화할 수 있도록 매개변수 없는 public 생성자를 제공해야 해요.

출처: Java API Reference

본문

이 인터페이스를 구현하는 알려진 클래스는 AbstractProcessor예요. 선언은 다음과 같아요.

public interface Processor

도구 인프라는 이 인터페이스를 구현하는 클래스와 다음 순서로 상호작용해요.

  1. 기존 Processor 객체를 쓰지 않는다면, 도구는 프로세서 클래스의 매개변수 없는 생성자를 호출해 인스턴스를 만들어요.
  2. 도구는 적절한 ProcessingEnvironmentinit 메서드를 호출해요.
  3. 이후 도구는 getSupportedAnnotationTypes, getSupportedOptions, getSupportedSourceVersion을 호출해요. 이 메서드들은 라운드마다가 아니라 실행당 한 번만 호출돼요.
  4. 상황에 맞게 도구는 Processor 객체의 process 메서드를 호출해요. 라운드마다 새 Processor 객체를 만들지는 않아요.

이 규약을 따르지 않고 프로세서 객체를 만들고 사용하면, 프로세서의 동작은 이 인터페이스 명세로 정의되지 않아요. 도구는 발견(discovery) 과정으로 어노테이션 프로세서를 찾고 실행 여부를 결정해요.

주요 메서드는 다음과 같아요.

void init(ProcessingEnvironment processingEnv)
boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv)
Iterable<? extends Completion> getCompletions(Element element, AnnotationMirror annotation,
    ExecutableElement member, String userText)
Set<String> getSupportedAnnotationTypes()
Set<String> getSupportedOptions()
SourceVersion getSupportedSourceVersion()
  • getSupportedAnnotationTypes(): 이 프로세서가 지원하는 어노테이션 인터페이스들의 이름을 반환해요.
  • getSupportedOptions(): 이 프로세서가 인식하는 옵션들을 반환해요.
  • getSupportedSourceVersion(): 이 어노테이션 프로세서가 지원하는 최신 소스 버전을 반환해요.
  • init(ProcessingEnvironment processingEnv): 처리 환경으로 프로세서를 초기화해요.
  • process(...): 이전 라운드에서 비롯된 루트 요소의 어노테이션 인터페이스 집합을 처리하고, 이 프로세서가 그 인터페이스들을 차지(claim)했는지 여부를 반환해요.
  • getCompletions(...): 어노테이션에 대한 제안 완성(completion)의 iterable을 도구 인프라에 반환해요.

도구가 어떤 프로세서를 실행할지는 루트 요소에 존재하는 어노테이션 인터페이스, 프로세서가 지원하는 어노테이션 인터페이스, 그리고 프로세서가 처리하는 어노테이션 인터페이스를 차지하는지 여부에 따라 결정돼요.

더 알아보기 (Learn more)

Java 공식 API