문제

을 고려 주석 처리를 프로그래밍 모델을 잘 설립을 구하는 방법에 대한 참조를 컴파일러 컨텍스트 내에서 어노테이션 프로세서와 함께 무언가 이것을 좋아한다:

context = ((JavacProcessingEnvironment) this.processingEnv).getContext();

이 컴파일러는 컨텍스트를 사용할 수 있습을 때 참조가 필요하여 내부의 컴파일러를 시설 Attr, Enter, MemberEnter, TreeMaker, 니다,등등.인스턴스를 통해 방법을 통:

make = TreeMaker.instance(context);

그러나 사용하여,Java8 플러그인 메커니즘, 수있는 방법 중 하나 참조 com.sun.tools.javac.util.Context 인스턴스가?문서 상태:

내에 컴파일러,하나의 컨텍스트가 사용에 대한 호출할 때마 이 컴파일러입니다.컨텍스트는 다음을 보장하는 데 사용되는 단일의 복사본을 각 컴파일러 단계에 존재하는 당 컴파일러를 호출을 기반으로 합니다.

그래서 내에서 플러그인 반면,참조하여 JavacTask 전달(을 효과적으로 BasicJavacTask),는 방법은 컨텍스트 객체의 현재 컴파일러 단계 검색?

도움이 되었습니까?

해결책

전화 getContext() 과 함께 작동하지 않습니다 Java8 컴파일러 플러그인 메커니즘:

((JavacTaskImpl) task).getContext()

예를 들어:

import com.sun.tools.javac.api.JavacTaskImpl;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.main.JavaCompiler;
// ...

JavacTask javacTask = getJavacTask();
Context context = ((JavacTaskImpl)javacTask).getContext();
JavaCompiler compiler = JavaCompiler.instance( context );

그러나 이러 com.sun.tools.javac.main.JavaCompiler 를 구현하지 않습니다 javax.tools.JavaCompiler 인터페이스와 API 므로 사용할 수 없을 사용하여 이 기법입니다.또한,주의에 대한 경고 JavacTaskImplcom.sun.tools.javac.main.JavaCompiler:

이지의 일부는 어떤 지원하는 API 입니다.만약 당신이 쓰는 코드에 따라 달라집이,당신은 당신의 자신의 위험이 있습니다.이 코드 및 내부 인터페이스가 예고없이 변경 또는 삭제 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top