컴파일을 하면 HelloWorld 클래스가 자동으로 만들어질 수 있도록 한다.
javapoet-1.2.0.jar 다운로드
https://mvnrepository.com/artifact/com.squareup/javapoet/1.2.0
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;
}
}
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.SOURCE)
public @interface HelloAnnotation {
}
javac -cp javapoet-1.2.0.jar HelloAnnotation.java HelloProcessor.java
HelloProcessor
@HelloAnnotation
public interface World {
}
javac -cp javapoet-1.2.0.jar:. -processor HelloProcessor World.java
annotation processor를 사용하면, 코드로 클래스를 만들 수 있다.(컴파일 단계)