2012-05-14 3 views
12

특정 메시지 유형을 처리하는 많은 처리기 클래스가 있습니다. 이 모든 핸들러를 등록하려면 어떤 핸들러가 있는지 알아야합니다. 현재는 특정 주석으로 모두 주석 처리되었으며 Java 6 주석 프로세서를 사용하여 모든 주석을 처리하고 주석이 달린 각 유형의 인스턴스를 보유하는 Register 클래스를 만듭니다.주석 처리기로 전체 소스 트리를 검사하려면 어떻게해야합니까?

전체 트리를 한꺼번에 빌드하는 경우에 효과적이지만 주석이 달린 클래스 중 하나만 빌드되는 경우 (예 : Eclipse에서 파일을 저장할 때) 프로세서는 해당 유형 만보고 빌드합니다 불완전한 등록부. 이 시나리오에서 다른 유형을 어떻게 검토 할 수 있습니까?

+0

어떤 특수 효과 프로세서를 사용하고 있습니까? –

+0

하나 저는 Java 6 API (javax.annotation.processing.AbstractProcessor를 확장) –

+0

+1을 사용하여 자신을 썼습니다. 내 자신의 조사에서 이것은 사용할 수 없지만 그것이 사실이라면 나는 그것에 대해 알고 싶습니다. –

답변

6

저는 이것을 지금까지 충분히 풀었습니다. 내가 한 것은 약간의 해킹이지만 기본적으로 주석이 달린 모든 클래스에 대해 HashSet에 이름을 추가합니다. 그런 다음 필자는 Filer.getResource()를 사용하여 이전에 본 모든 주석 클래스를 기록한 파일을 열고 HashSet에 추가합니다. 그런 다음 레지스터 클래스를 생성하고 전체 HashSet을 Filer.createResource()를 사용하여 동일한 리소스에 작성합니다. 주석이 달린 형식을 삭제해도 문제가 발생합니다. 주석이 달린 형식은 여전히 ​​해당 파일에 기록되기 때문에 프로젝트를 정리하거나 해당 파일을 삭제하면 문제를 해결할 수 있습니다.

편집 : 또한 Filer.createSource()에 적절한 "원본 요소"를 전달하면 Eclipse가 해당 종속성을 올바르게 추적 할 수 있어야하지만 그렇지 않습니다. 아마 그것은 Eclipse 버그입니다.

+0

어디서나이 코드를 공유합니까? 당신의 접근 방식에 관심이 있습니다. –

+0

이것은 회사에서 소유 한 코드입니다. 개인 프로젝트 용으로 이와 같은 것을 작성하면 사용할 수 있습니다. –

+0

[generic library] (https://github.com/sentinelt/evo-classindex)를 작성했습니다. 이. 내 도서관이 같은 문제를 앓고 있기 때문에 나는이 페이지를 발견했다 ... –

1

당연히 컴파일 타임 주석 프로세서는 컴파일되는 파일 만 처리합니다. 이클립스는 점진적 컴파일을 사용하여 시간을 절약하므로 짧은 대답은 주석 프로세서가 모든 유형을 한 번에 볼 수 없다는 것입니다.

한 가지 해결책은 증분 컴파일을 지원하도록 아키텍처를 변경하는 것입니다. 예를 들어, 각각의 주석이 달린 HandlerClass에 대해 해당 핸들러 클래스를 등록하는 RegisterHandlerClass 클래스를 생성합니다.

즉, Reflections과 같은 도구를 사용하면 런타임시 더 잘 수행 될 것입니다.

+1

이것은 Android 코드이며, 대부분의 프레임 워크가 Android에서 작동하지 않는 것처럼 보입니다. 어쨌든 클래스 패스 스캔을 피하고 싶습니다. RegisterHandlerClass 경로를 방문한 경우 정확히 어떻게 도움이 될까요? "등록기 레지스터"가 없어도 해당 클래스를 적절한 처리기 클래스로 등록하려면 어떻게해야합니까? –

+0

처리기 클래스가로드되지 않는 문제 인 경우 RegisterHandlerClass 아이디어가 작동하지 않습니다. Handler Class마다 하나의 리소스 파일을 만들어서 동일한 디렉터리에 모두 넣은 다음 런타임에 해당 디렉터리를 스캔 할 수 있습니다. –

관련 문제