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;
}