ノイズプロセッサ
15672 ワード
ロムフォード(Lombok)標準コードライブラリ @Getter、@Setter、@Builderなど ロム服を使う依存性 を追加 IntelliJ Lombokプラグイン IntelliJ Annotation処理オプション を有効にする
ロムフォードの動作原理コンパイル時に、ソースコードの抽象同期ツリー(AST)を自動処理プログラムで操作する .
論争
元々は注釈付きクラスの情報しか参照できず、修正はできません
公開されたAPIではなくコンパイラ内部クラスを使用して既存のソースコードを操作
特にこのクリップでは、Java Agentを使用してコンパイラクラスを操作および使用することもできます.
同様に、公開されたAPIではないため、バージョン互換性に問題が発生する可能性があります.
それでも極めて便利で広く用いられており、いくつかの代替案があるが、ロムフォードのすべての機能と利便性に取って代わることはできない.
ノイズプロセッサ
プロセッサインタフェースは、複数のラウンドにわたるソースコードおよびコンパイルコード をサポートする.
ユーティリティ自動サービス:サービス構成レジストリジェネレータ. コンパイル時に匿名プロセッサMETA-INF/services/javaxを使用します.annotation.processor. プロセッサファイルの自動生成
ファイルマネージャインタフェースソースコード、クラスコードおよびリソースを生成するためのインタフェース . Javapoet:ソースコード生成ユーティリティ サイレント処理
人工知能プロセッサの使用例レンフール AutoService: java.util.ServiceLoaderファイル作成ユーティリティ @Override https://stackoverflow.com/questions/18189980/how-do-annotations-like-override-work-internally-in-java/18202623 Dangger 2:コンパイル時DI を提供アンドロイド ButterKnife:@BindView(ビューとプレゼンテーションのフィールドバインド付き) DeepLinkDispatch: を使用して、特定のURIリンクをアクティブに接続します.
自動化されたプロセッサーのメリットのランタイムコスト(コンパイル時に完了するため)を必要としない .
リファレンス
https://www.inflearn.com/course/the-java-code-manipulation
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
インストールロムフォードの動作原理
論争
元々は注釈付きクラスの情報しか参照できず、修正はできません
公開されたAPIではなくコンパイラ内部クラスを使用して既存のソースコードを操作
特にこのクリップでは、Java Agentを使用してコンパイラクラスを操作および使用することもできます.
同様に、公開されたAPIではないため、バージョン互換性に問題が発生する可能性があります.
それでも極めて便利で広く用いられており、いくつかの代替案があるが、ロムフォードのすべての機能と利便性に取って代わることはできない.
プロセッサインタフェース
ユーティリティ
<dependency>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service</artifactId>
<version>1.0-rc6</version>
</dependency>
@AutoService(Processor.class)
public class MagicMojaProcessor extends AbstractProcessor {
...
}
ファイルマネージャインタフェース
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(Magic.class);
for (Element element : elements) {
Name elementName = element.getSimpleName();
if (element.getKind() != ElementKind.INTERFACE) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Magic annotation can not be used on " + elementName);
} else {
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Processing " + elementName);
}
TypeElement typeElement = (TypeElement)element;
ClassName className = ClassName.get(typeElement);
//메서드 생성
MethodSpec pullOut = MethodSpec.methodBuilder("pullOut")
.addModifiers(Modifier.PUBLIC)
.returns(String.class)
.addStatement("return $S", "Rabbit!")
.build();
//클래스 생성
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;
}
ユーティリティ人工知能プロセッサの使用例
自動化されたプロセッサーのメリット
リファレンス
https://www.inflearn.com/course/the-java-code-manipulation
Reference
この問題について(ノイズプロセッサ), 我々は、より多くの情報をここで見つけました https://velog.io/@alwayslee_12/애노테이션-프로세서テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol