これは、バイナリで注釈プロセッサを実行する場合に使用できると思います。クラスは、処理したいタイプです。
デモコード:
public class MyProcessor extends AbstractProcessor {
public static @interface X { String value(); }
@X("Hello") public static class Y {}
@Override public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
for (Element element : roundEnv.getRootElements()) {
X x = element.getAnnotation(X.class);
if (x != null) System.out.println(x.value());
}
return true;
}
@Override public Set<String> getSupportedAnnotationTypes() {
return new HashSet<String>(Arrays.asList(X.class.getCanonicalName()));
}
@Override public SourceVersion getSupportedSourceVersion() {
return SourceVersion.RELEASE_6;
}
public static void main(String[] args) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
List<String> classes = Arrays.asList(Y.class.getCanonicalName());
List<String> options = Arrays.asList("-processor", MyProcessor.class
.getCanonicalName());
CompilationTask task = compiler.getTask(null, null, null, options, classes,
null);
task.call();
}
}
上記のコードは"Hello"
をプリントアウト。
なぜアノテーションプロセッサをクラスファイルで実行したいのですか?私は、JavaCompiler全体のポイントは、クラスファイルではなく、ソースコードをコンパイルすることだと考えました。注釈プロセッサは、元のソースコードのようにオンザフライでコンパイルされたソースコード内のアノテーションを展開することは私の理解です。どうか明らかにしてください。 – Gili
処理の一部としてクラスを生成およびコンパイルすることができます。すべての時間を常に再コンパイルすることは常に望ましいとは限りません。たとえば、完全なビルドに1時間かかる場合です。バイナリプラグインをインストールすると、コンテナによってベンダー固有のコードが生成されることもあります.APTはこれを行う方法の1つです(EJBコンテナなど)。 APIはコマンドラインをきめ細かく反映していることに注意してください。http://java.sun.com/javase/6/docs/technotes/tools/solaris/javac.html#synopsis決定的な回答が必要な場合は、 JSR199仕様がリードしています。 – McDowell
私はあなたを正しく理解しているので、ソースコードのコンパイルは「ソースからバイナリ」と「注釈処理」という2つの段階を経て実行されます。このパラメータを使用すると、「ソースからバイナリ」フェーズをスキップし、「アノテーション処理」だけを行うことができますか? – Gili