2009-08-09 11 views
4

私はJavaCompiler.getTask()を理解しようとしています。私はclassesと呼ばれる最後の2番目を除くすべてのパラメータを理解しています。 Javadocは読み:(注釈処理用)JavaCompiler.getTask()の "classes"パラメータの使用方法は?

クラス名、nullは、クラス名

を意味していないが、私は、彼らが何を意味するのか理解していません。私は、JavaCompilerオンラインを参照している多くのWebサイトを見つけましたが、どれもこのパラメータについて説明していません。何か案は?

答えて

2

これは、バイナリで注釈プロセッサを実行する場合に使用できると思います。クラスは、処理したいタイプです。

デモコード:

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"をプリントアウト。

+0

なぜアノテーションプロセッサをクラスファイルで実行したいのですか?私は、JavaCompiler全体のポイントは、クラスファイルではなく、ソースコードをコンパイルすることだと考えました。注釈プロセッサは、元のソースコードのようにオンザフライでコンパイルされたソースコード内のアノテーションを展開することは私の理解です。どうか明らかにしてください。 – Gili

+0

処理の一部としてクラスを生成およびコンパイルすることができます。すべての時間を常に再コンパイルすることは常に望ましいとは限りません。たとえば、完全なビルドに1時間かかる場合です。バイナリプラグインをインストールすると、コンテナによってベンダー固有のコードが生成されることもあります.APTはこれを行う方法の1つです(EJBコンテナなど)。 APIはコマンドラインをきめ細かく反映していることに注意してください。http://java.sun.com/javase/6/docs/technotes/tools/solaris/javac.html#synopsis決定的な回答が必要な場合は、 JSR199仕様がリードしています。 – McDowell

+0

私はあなたを正しく理解しているので、ソースコードのコンパイルは「ソースからバイナリ」と「注釈処理」という2つの段階を経て実行されます。このパラメータを使用すると、「ソースからバイナリ」フェーズをスキップし、「アノテーション処理」だけを行うことができますか? – Gili

関連する問題