annotation processor 실습

jinwook han·2024년 4월 23일
0

목적

컴파일을 하면 HelloWorld 클래스가 자동으로 만들어질 수 있도록 한다.

과정

  1. javapoet-1.2.0.jar 다운로드
    https://mvnrepository.com/artifact/com.squareup/javapoet/1.2.0

  2. HelloProcessor.java 작성
    강의 '더 자바, 코드를 조작하는 다양한 방법'에서 나오는 코드를 기반으로 수정했습니다. 코드는 거의 같습니다.
    https://www.inflearn.com/course/the-java-code-manipulation

HelloAnnotation 어노테이션이 붙은 클래스가 있으면, HelloWorld 파일을 만듭니다.

import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.Processor;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.element.*;
import javax.tools.Diagnostic;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class HelloProcessor extends AbstractProcessor {

     public HelloProcessor() {
        super();
    }

    @Override
    public Set<String> getSupportedAnnotationTypes() {
        return new HashSet<>(Arrays.asList(HelloAnnotation.class.getName()));
    }
    
    @Override

            if (element.getKind() != ElementKind.INTERFACE) {
            } else {
            }
            TypeElement typeElement = (TypeElement) element;
            ClassName className = ClassName.get(typeElement);

                    .addModifiers(Modifier.PUBLIC)
                    .returns(String.class)
                    .addStatement("return $S", "hello world!")
                    .build();

            TypeSpec helloworld = TypeSpec.classBuilder("HelloWorld")
                    .addModifiers(Modifier.PUBLIC)
                    .addMethod(helloWorldMethod)
                    .build();

            Filer filer = processingEnv.getFiler();
            try {
                JavaFile.builder(className.packageName(), helloworld)
                        .build()
                        .writeTo(filer);
            } catch (IOException e) {
                processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, e.getMessage());
            }
        }

        return true;
    }
}
  1. HelloAnnotation.java 작성
    annotation processor 대상임을 나타내는 어노테이션입니다.
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.SOURCE)
public @interface HelloAnnotation {

}
  1. HelloAnnotation, HelloProcessor 컴파일
javac -cp javapoet-1.2.0.jar HelloAnnotation.java HelloProcessor.java
  1. META-INF/services에 "javax.annotation.processing.Processor" 파일 생성
    파일에는 방금 HelloProcessor의 fully qualified class name을 넣습니다.
    (이 예시에서는 HelloProcessor의 패키지를 따로 두지 않으므로 HelloProcessor만 작성)
HelloProcessor
  1. World.java 작성
@HelloAnnotation
public interface World {
}
  1. World.java 컴파일
    classpath에 HelloProcessor의 위치까지 포함합니다.(여기에서는 .)
    processor 옵션에 HelloProcessor를 넣습니다.
javac -cp javapoet-1.2.0.jar:. -processor HelloProcessor World.java
  1. 컴파일 이후 HelloWorld.java 및 HelloWorld.class가 만들어져 있는 모습을 확인할 수 있습니다.

요약

annotation processor를 사용하면, 코드로 클래스를 만들 수 있다.(컴파일 단계)

0개의 댓글

관련 채용 정보