Java 5에서 추가되었으며, 컴파일 단계에서 추가 소스파일을 생성하는 기술입니다.

소스파일이 java일 필용벗이 소스코드의 주석을 기반으로 모든 종류의 설명, 메타데이터, 문서, 리소스 또는 기타 유형의 파일을 생성할 수 있습니다.

예시로 lombok 라이브러리는 @Getter 어노테이션으로 getter를 자동생성해주는 것과 같다. 하지만 이는 기존 파일을 변경하지 않고 새 파일 생성하는데만 사용할 수 있습니다.

Annotation Processer API는 javax.annotation.processing 패키지에 있습니다. 구현해야 하는 주요 인터페이스는 AbstractPorcessor 클래스로 부분적을 구현되어 있는 Processor 인터페이스입니다.

아래 Person 클래스에 Builder를 만들어 준다고 가정

public class Person {
	private int age;
	private String name;
}

// 빌더 사용 예시
Person person = new PersonBuilder()
	.setAge(1)
	.setName("temp")
	.build()

이제 빌더에 값을 넣을 수 있게할 주석을 하나 만들어보자

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface BuilderProperty {
}
public class Person {
	private int age;
  private String name;

  @BuilderProperty
  public void setAge(int age) {
      this.age = age;
  }

  @BuilderProperty
  public void setName(String name) {
      this.name = name;
  }
    // getters …
}

AbstractProcessor 구현

@SupportedAnnotationTyps(
	"kr.test.annotation.processor.BuilderProperty"
)
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@AutoService(Processor.class)
public class BuilderProcessor extends AbstractProcessor {

	@Override
	public boolean process(Set<? extends TypeElement> annotations,
			RoundEnvironment roundEnv) {
		for (TypeElement annotation: annotations) {
			Map<Boolean, List<Element>> annotatedMethods = annotatedElements.stream().collect(
  Collectors.partitioningBy(element ->
    ((ExecutableType) element.asType()).getParameterTypes().size() == 1
    && element.getSimpleName().toString().startsWith("set")));

			List<Element> setters = annotatedMethods.get(true);
			List<Element> otherMethods = annotatedMethods.get(false);
		}
		return true;
	}
}

위 코드는 @BuilderProperty 주석이 달린 모든 요소를 수신합니다.

파라미터 개수는 한개 이면서 set으로 시작하는 메소드명을 찾습니다.