annotation processor을 작성하여 클래스에 메소드 및 필드를 삽입하려고합니다 ... 문서가 너무 희박합니다. 나는 멀지는 않을 것이고 내가 올바르게 접근하는지 모르겠습니다.주석 처리기로 코드 교체
처리 환경은 Filer
개체를 제공합니다.이 개체에는 새로운 원본 및 클래스 파일을 만드는 편리한 방법이 있습니다. 그런 다음 잘 작동하지만 기존 소스 파일을 읽는 방법을 알아 내려고했습니다.이 파일은 모두 "getResource"입니다. 그래서 내 프로세서 구현에 나는이 짓을했는지 :
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
try {
for (TypeElement te : annotations) {
for (Element element : roundEnv.getElementsAnnotatedWith(te)) {
FileObject in_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_PATH, "",
element.asType().toString().replace(".", "/") + ".java");
FileObject out_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_OUTPUT, "",
element.asType().toString().replace(".", "/") + ".java");
//if (out_file.getLastModified() >= in_file.getLastModified()) continue;
CharSequence data = in_file.getCharContent(false);
data = transform(data); // run the macro processor
JavaFileObject out_file2 = processingEnv.getFiler().createSourceFile(
element.asType().toString(), element);
Writer w = out_file2.openWriter();
w.append(data);
w.close();
}
}
} catch (Exception e) {
e.printStackTrace();
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, e.getMessage());
}
return true;
}
내 첫 당황 내가 아닌 element.asType().toString().replace(".", "/") + ".java"
이 (정규화 된 형식 이름을 얻고 패키지 및 소스 파일 경로로 변환) 느낌 도움이되지 수있다 문제에 접근하는 좋은 방법. 나머지 API는 너무 지나치게 조작되었지만 원래 소스 코드를 검색하는 편리한 방법은없는 것처럼 보입니다.
실제 문제는 컴파일러가 출력 디렉토리의 두 번째 소스 파일 ("오류 : 중복 클래스")에 의해 자발적으로 화가 나서 이제 막혔다는 것입니다.
필자는 나머지 부분을 이미 작성했습니다 - 일부 데이터를 계산하고 필드 값과 메소드를 삽입하기위한 매크로 렉서 (macro lexer)와 파서 (parser) 등은 컴파일러 외부의 초기 단계로 작동합니다. 원본 파일이 .java 확장자를 가질 수 없다는 점을 제외하면 (컴파일러가 파일을 보지 못하게하기 위해) 이것은 잘 작동합니다. 그런 다음 주석이 코드 생성을 수행 할 수 있다고 들었습니다. 코드 생성은 더 정확하고 편리 할 것이라고 생각하지만 많은 지침을 찾을 수는 없습니다.
참조 : http://techbitsfromsridhar.blogspot.ca/2013/02/java-compiler-plug-ins-in-java-8-use.html –