2009-08-09 2 views
4

나는 JavaCompiler.getTask()을 이해하려고합니다. classes이라는 두 번째 매개 변수를 제외한 모든 매개 변수를 이해합니다. Javadoc가 읽기 : (주석 처리)JavaCompiler.getTask()의 ​​"classes"매개 변수를 사용하는 방법은 무엇입니까?

클래스 이름, null가 더 클래스 이름

을 의미하지만 나는 그들이 무슨 뜻인지 이해가 안 돼요. JavaCompiler 온라인을 참조하는 많은 웹 사이트를 발견했지만이 매개 변수에 대해서는 설명하지 않았습니다. 어떤 아이디어?

답변

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의 핵심은 클래스 파일이 아니라 소스 코드를 컴파일하는 것이라고 생각했습니다. 어노테이션 프로세서는 원래 소스 코드의 일부처럼 온 - 더 - 플라이 (on-the-fly)로 컴파일 된 해당 소스 코드의 주석을 확장합니다. 명확히하십시오. – Gili

+0

처리의 일부로 클래스를 생성하고 컴파일 할 수 있습니다. 항상 모든 것을 다시 컴파일하는 것은 바람직하지 않습니다. 예를 들어 전체 빌드에 1 시간이 걸리는 경우입니다. 또는 바이너리 플러그인을 설치할 때 컨테이너가 공급 업체 특정 코드를 생성합니다. APT는이를 수행하는 한 가지 방법입니다 (EJB 컨테이너와 같은 것). API가 명령 행을 매우 밀접하게 반영한다는 점에 유의하십시오. http://java.sun.com/javase/6/docs/technotes/tools/solaris/javac.html#synopsis 확실한 답을 원한다면 JSR199 스펙 리드. – McDowell

+0

그래서 내가 올바르게 이해한다면, 소스 코드 컴파일은 "소스에서 바이너리"와 "주석 처리"의 두 단계로 진행됩니다. 이 매개 변수를 사용하면 "소스를 바이너리"단계로 건너 뛰고 "주석 처리 만"할 수 있다고 말하고 있습니까? – Gili

관련 문제