Как использовать параметр «классы» JavaCompiler.getTask ()? - PullRequest
4 голосов
/ 10 августа 2009

Я пытаюсь понять JavaCompiler.getTask(). Я понимаю все параметры, кроме второго до последнего, называемого classes. Javadoc гласил:

имена классов (для обработки аннотаций), null означает отсутствие имен классов

но я не понимаю, что они имеют в виду. Я нашел много сайтов, ссылающихся на JavaCompiler, но ни один из них не объясняет этот параметр. Есть идеи?

1 Ответ

2 голосов
/ 10 августа 2009

Я считаю, что это можно использовать, когда вы хотите запускать процессоры аннотаций в двоичных файлах. Классы - это типы, которые вы хотите обработать.

Демо-код:

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".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...