나는 바이너리에 어노테이션 프로세서를 실행하고 싶을 때 사용할 수 있다고 생각한다. 클래스는 처리하려는 유형입니다.
데모 코드 :
는
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의 핵심은 클래스 파일이 아니라 소스 코드를 컴파일하는 것이라고 생각했습니다. 어노테이션 프로세서는 원래 소스 코드의 일부처럼 온 - 더 - 플라이 (on-the-fly)로 컴파일 된 해당 소스 코드의 주석을 확장합니다. 명확히하십시오. – Gili
처리의 일부로 클래스를 생성하고 컴파일 할 수 있습니다. 항상 모든 것을 다시 컴파일하는 것은 바람직하지 않습니다. 예를 들어 전체 빌드에 1 시간이 걸리는 경우입니다. 또는 바이너리 플러그인을 설치할 때 컨테이너가 공급 업체 특정 코드를 생성합니다. APT는이를 수행하는 한 가지 방법입니다 (EJB 컨테이너와 같은 것). API가 명령 행을 매우 밀접하게 반영한다는 점에 유의하십시오. http://java.sun.com/javase/6/docs/technotes/tools/solaris/javac.html#synopsis 확실한 답을 원한다면 JSR199 스펙 리드. – McDowell
그래서 내가 올바르게 이해한다면, 소스 코드 컴파일은 "소스에서 바이너리"와 "주석 처리"의 두 단계로 진행됩니다. 이 매개 변수를 사용하면 "소스를 바이너리"단계로 건너 뛰고 "주석 처리 만"할 수 있다고 말하고 있습니까? – Gili