code manipulation : annotation processor #2

This commit is contained in:
haerong22
2021-02-22 18:15:29 +09:00
parent 2f6598a763
commit 22e9eaebcc
4 changed files with 45 additions and 7 deletions

View File

@@ -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());
}
}

View File

@@ -2,6 +2,5 @@ package org.example;
@Magic
public interface Moja {
String pullOut();
}

View File

@@ -32,6 +32,12 @@
<version>1.0-rc6</version>
</dependency>
<dependency>
<groupId>com.squareup</groupId>
<artifactId>javapoet</artifactId>
<version>1.13.0</version>
</dependency>
</dependencies>
</project>

View File

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