TIL: Anotation Processor

TIL: Anotation Processor

Processor Interface 여러 라운드(rounds)에 걸쳐 소스 및 컴파일 된 코드를 처리할 수 있다.

어노테이션 프로세서 사용 예 롬복 AutoService : java.util.ServiceLoader 용 파일 생성 유틸리티 @Override Dagger 2 : 컴파일 타임 DI 제공 안드로이드 라이브러리

어노테이션 프로세서의 장점 런타임 비용이 제로

어노테이션 프로세서를 사용법

@Override public boolean process(Set annotations, RoundEnvironment roundEnv) { Set elements = roundEnv.getElementsAnnotatedWith(Magic.class); for (Element element : elements) { Name elementName = element.getSimpleName(); if (element.getKind() != ElementKind.INTERFACE) { processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Magic annotation can not be used on " + elementName); } else { processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Processing " + elementName); } TypeElement typeElement = (TypeElement)element; ClassName className = ClassName.get(typeElement); MethodSpec pullOut = MethodSpec.methodBuilder("pullOut") .addModifiers(Modifier.PUBLIC) .returns(String.class) .addStatement("return $S", "Rabbit!") .build(); TypeSpec magicMoja = TypeSpec.classBuilder("MagicMoja") .addModifiers(Modifier.PUBLIC) .addSuperinterface(className) .addMethod(pullOut) .build(); Filer filer = processingEnv.getFiler(); try { JavaFile.builder(className.packageName(), magicMoja) .build() .writeTo(filer); } catch (IOException e) { processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "FATAL ERROR: " + e); } } return true;

강의 끗!

from http://jacksonhong.tistory.com/51 by ccl(A) rewrite - 2021-12-13 07:02:24