【Java】Pluggable Annotation Processing API

■ はじめに

https://blogs.yahoo.co.jp/dk521123/37773041.html
で、「Pluggable Annotation Processing API」を使っているとのことだったので、調べてみた。

■ Pluggable Annotation Processing API

 * コンパイル時にアノテーションを読み込んでくれる機能
  => アノテーションについては、以下の関連記事を参照のこと
https://blogs.yahoo.co.jp/dk521123/32740125.html
 * Java1.6から追加された機能

補足

 * Java1.5から追加されたAnnotation Processing Tool (apt)とは別物

■ サンプル

 * 「Hello World」をやってみる

DemoAnnotationProcessor.java

package com.sample.annotation;

import java.util.HashSet;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;

public class DemoAnnotationProcessor extends AbstractProcessor {
  private int round = 1;

  @Override
  public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnvironment) {
    System.out.println("Round : " + (this.round++));
    annotations.forEach(System.out::println);
    return true;
  }

  @Override
  public Set<String> getSupportedAnnotationTypes() {
    Set<String> supportedAnnotationTypes = new HashSet<>();
    supportedAnnotationTypes.add("*");
    return supportedAnnotationTypes;
  }

  @Override
  public SourceVersion getSupportedSourceVersion() {
    return SourceVersion.RELEASE_8;
  }
}

DemoClass.java

package com.sample.annotation;

public class DemoClass {
  @Deprecated
  public void deprecatedMethod() {
  }

  @Override
  public String toString() {
    return "demo";
  }
}

コマンド実行

# [1] 移動
cd C:\eclipse\workspace\DemoProject\src\main\java

# [2] コンパイル前に確認
dir com\sample\annotation\* /b

DemoAnnotationProcessor.java
DemoClass.class

# [3] コンパイル
javac com/sample/annotation/DemoAnnotationProcessor.java

# [4] コンパイル後の確認
dir com\sample\annotation\* /b

DemoAnnotationProcessor.java
DemoAnnotationProcessor.class << コンパイルしてクラスファイルができた
DemoClass.class

# [5] 実行
javac -processor com.sample.annotation.DemoAnnotationProcessor com/sample/annotation/DemoClass.java

Round : 1
java.lang.Deprecated
java.lang.Override
Round : 2


関連記事

アノテーション ~ Annotation ~

https://blogs.yahoo.co.jp/dk521123/32740125.html

Antビルドにより、CSVファイルからEnumクラスを自動生成する

https://blogs.yahoo.co.jp/dk521123/33914928.html