2009-08-09 3 views
4

Ich versuche zu verstehen JavaCompiler.getTask(). Ich verstehe alle Parameter mit Ausnahme der vorletzten genannt classes. Die Javadoc lesen:Wie verwendet man den Parameter "classes" von JavaCompiler.getTask()?

Klassennamen (für Anmerkung Verarbeitung), null bedeutet, dass keine Klassennamen

aber ich verstehe nicht, was sie bedeuten. Ich habe viele Webseiten gefunden, die sich auf JavaCompiler im Internet beziehen, aber keiner von ihnen erklärt diesen Parameter. Irgendwelche Ideen?

Antwort

2

Ich glaube, das kann verwendet werden, wenn Sie Annotationsprozessoren auf Binärdateien ausführen möchten. Die Klassen würden die Typen sein, die Sie verarbeiten möchten.

Demo-Code:

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(); 
    } 
} 

Der obige Code druckt "Hello" aus.

+0

Warum sollten Sie jemals Annotationsprozessoren für Klassendateien ausführen? Ich dachte, der ganze Sinn von JavaCompiler wäre es, Quellcode zu kompilieren, keine Klassendateien. Es ist mein Verständnis, dass Annotationsprozessoren Annotationen in diesem Quellcode erweitern, die im Handumdrehen kompiliert werden, als ob sie Teil des ursprünglichen Quellcodes wären. Bitte klären Sie. – Gili

+0

Sie können Klassen als Teil der Verarbeitung generieren und kompilieren. Es ist nicht immer wünschenswert, alles ständig neu zu kompilieren - wenn ein vollständiger Build beispielsweise eine Stunde dauert. Oder vielleicht erzeugt ein Container herstellerspezifischen Code, wenn Sie ein binäres Plugin installieren - die APT wäre eine Möglichkeit, dies zu tun (Dinge wie EJB-Container). Beachten Sie, dass die API die Befehlszeile ziemlich genau widerspiegelt: http://java.sun.com/javase/6/docs/technotes/tools/solaris/javac.html#synopsis Wenn Sie definitive Antworten wünschen, müssen Sie möglicherweise die Frage stellen JSR199 Spezifikationen führt. – McDowell

+0

Also, wenn ich Sie richtig verstehe, läuft das Kompilieren von Quellcode durch zwei Phasen: "Source to binary" und "Annotation Processing". Wollen Sie damit sagen, dass Sie mit diesem Parameter die "Source to Binary" -Phase überspringen können und nur "Annotation Processing" machen? – Gili

Verwandte Themen