ノイズプロセッサ


ロムフォード(Lombok)
  • 標準コードライブラリ
  • @Getter、@Setter、@Builderなど
  • ロム服を使う
  • 依存性
  • を追加
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.8</version>
        <scope>provided</scope>
    </dependency>
    インストール
  • IntelliJ Lombokプラグイン
  • IntelliJ Annotation処理オプション
  • を有効にする
    ロムフォードの動作原理
  • コンパイル時に、ソースコードの抽象同期ツリー(AST)を自動処理プログラムで操作する
  • .
    論争

  • 元々は注釈付きクラスの情報しか参照できず、修正はできません

  • 公開された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 {
    ...
    }
  • コンパイル時に匿名プロセッサMETA-INF/services/javaxを使用します.annotation.processor.
  • プロセッサファイルの自動生成
    ファイルマネージャインタフェース
  • ソースコード、クラスコードおよびリソースを生成するためのインタフェース
  • .
    @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;
    }
    ユーティリティ
  • 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