diff --git a/code-manipulation/annotation-processor/src/main/java/org/example/App.java b/code-manipulation/annotation-processor/src/main/java/org/example/App.java index 63149c8e..3336f9fc 100644 --- a/code-manipulation/annotation-processor/src/main/java/org/example/App.java +++ b/code-manipulation/annotation-processor/src/main/java/org/example/App.java @@ -2,7 +2,7 @@ package org.example; public class App { public static void main( String[] args ) { -// Moja moja = new MojaFactory(); -// System.out.println(moja.pullOut()); + Moja moja = new MagicMoja(); + System.out.println(moja.pullOut()); } } diff --git a/code-manipulation/annotation-processor/src/main/java/org/example/Moja.java b/code-manipulation/annotation-processor/src/main/java/org/example/Moja.java index 46a8581b..d34c56a0 100644 --- a/code-manipulation/annotation-processor/src/main/java/org/example/Moja.java +++ b/code-manipulation/annotation-processor/src/main/java/org/example/Moja.java @@ -2,6 +2,5 @@ package org.example; @Magic public interface Moja { - String pullOut(); } diff --git a/code-manipulation/magic-annotation/pom.xml b/code-manipulation/magic-annotation/pom.xml index 7e1e251c..e346d1ef 100644 --- a/code-manipulation/magic-annotation/pom.xml +++ b/code-manipulation/magic-annotation/pom.xml @@ -32,6 +32,12 @@ 1.0-rc6 + + com.squareup + javapoet + 1.13.0 + + diff --git a/code-manipulation/magic-annotation/src/main/java/org/example/MagicMojaProcessor.java b/code-manipulation/magic-annotation/src/main/java/org/example/MagicMojaProcessor.java index 44edae82..44645035 100644 --- a/code-manipulation/magic-annotation/src/main/java/org/example/MagicMojaProcessor.java +++ b/code-manipulation/magic-annotation/src/main/java/org/example/MagicMojaProcessor.java @@ -1,16 +1,19 @@ package org.example; import com.google.auto.service.AutoService; +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.SourceVersion; -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.Name; -import javax.lang.model.element.TypeElement; +import javax.lang.model.element.*; import javax.tools.Diagnostic; +import java.io.IOException; import java.util.Set; @AutoService(Processor.class) @@ -45,6 +48,36 @@ public class MagicMojaProcessor extends AbstractProcessor { processingEnv.getMessager() .printMessage(Diagnostic.Kind.NOTE, "Processing " + elementName); } + + // element 의 className ( FQCN ) + TypeElement typeElement = (TypeElement) element; + ClassName className = ClassName.get(typeElement); + + // pullOut 메소드 생성 + MethodSpec pullOut = MethodSpec.methodBuilder("pullOut") + .addModifiers(Modifier.PUBLIC) + .returns(String.class) + .addStatement("return $S", "Rabbit!") + .build(); + + // magicMoja 클래스 생성 + 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; }