0

주석 처리를 위해 이클립스, 자바 및 https://marketplace.eclipse.org/content/m2e-apt의 마지막 버전을 사용합니다. 단일 주석을 처리하고 주석이 달린 클래스 내의 메소드를 살펴본 프로세서를 사용하여 모든 비 전용 메소드를 가져 와서 주석이 포함 된 인터페이스 (주석이 달린 클래스가 구현)를 작성합니다. 그래서 기본적으로이 클래스는 생성 될 인터페이스를 구현합니다. 주석이 달린 클래스 A와 B가 각 메소드와 동일한 패키지에 IntA와 IntB 인터페이스를 생성한다고 가정 해 보겠습니다. 반환 형식이 IntB 인 A 클래스의 메서드가 있다고 가정 해 보겠습니다.자바 주석 프로세스가 아직 생성되지 않았습니다.

내 주석 프로세서에서 TypeElement 및 TypeMirror ((ExecutableElement) 요소) .getReturnType()과 같은 것들을 사용하여 AbstractProcessor를 확장하고 주석 된 클래스의 메서드에 해당하는 ExecutableElement의 반환 값의 TypeMirror를 가져옵니다. 그런 다음이 TypeMirror의 toString()을 사용하여 생성 된 인터페이스에 메서드의 반환 값을 씁니다.

IntB가 IntB보다 먼저 생성 된 경우 IntA로 작성된이 메서드는 정규화 된 이름없이 IntB를 반환하는 메서드를 가지므로 (아직 생성되지 않았기 때문에 프로세서가 IntB에 대해 아무 것도 모르기 때문에) IntA에서 오류가 발생합니다. 클래스 A에서 무언가를 수정하면 (클래스를 주석으로 생성 된 파일에만 영향을 미칠 수있는 이클립스가 점진적으로 파일을 생성합니다),이 오류는 IntB가 이미 생성되어 있으므로 해결됩니다. 해당 메소드의 리턴 값으로 완전한 이름을 작성하십시오.

클래스 A에서 IntB를 반환하는 메서드의 반환 값에 대한 정규화 된 이름을 작성하면이 문제를 피할 수 있음을 알았습니다. 그러나 IntB가 이미 생성 된 경우 나중에이 클래스를 처리하도록 프로세서를 만들려면이 경우가 필요합니다.

어떻게 클래스 A의 주석 처리 과정을 지연시킬 수 있습니까?

추 신 : 지금까지는 다음 구문 (element.getReturnType(). getKind() == TypeKind.ERROR)에 대한 모든 메소드의 반환 값을 확인하는 메커니즘을 만들었습니다. 예외를 추가하고 다른 라운드에서 처리 될 목록에이 요소를 추가하십시오. 동일한 문제로 몇 번 더 요소를 처리 할 때 작동하지 않았습니다. 또한 process() 메서드에 false를 반환하려고 시도했지만 AbstractProcessor에서 재정의되었지만 여전히 작동하지 않았습니다.

답변

0

주석 처리와 동일한 라운드에서 클래스 A와 B 모두에 액세스 할 가능성이 높기 때문에 먼저 생성되는 모든 인터페이스에 대한 정보를 수집하십시오.

주석 처리기는 처리 시작시 한 번만 인스턴스화되므로 속성을 사용하여 생성 된 인터페이스가 필요한 클래스에 대한 메타 정보를 저장할 수 있습니다.

그런 다음 주석으로 모든 클래스를 처리 한 후 해당 정보를 사용하여 모든 인터페이스를 한 번에 작성하십시오.

절대적으로 1 초가 될 때까지 인터페이스 생성을 지연하려면, RoundEnvironment.processingOver()을보십시오.