2012-05-14 30 views
12

Tôi có rất nhiều lớp xử lý xử lý các loại tin nhắn cụ thể. Để đăng ký tất cả các trình xử lý này, tôi cần phải biết trình xử lý nào tồn tại. Hiện tại, tất cả chúng đều được chú thích với chú thích cụ thể và tôi sử dụng bộ xử lý chú thích Java 6 để nhận tất cả chúng và tạo lớp Đăng ký chứa một cá thể của từng loại chú thích. Điều này làm việc tuyệt vời nếu toàn bộ cây đang được xây dựng cùng một lúc, nhưng nếu chỉ một trong các lớp chú thích đang được xây dựng (khi tôi lưu tệp trong Eclipse, ví dụ), bộ xử lý chỉ thấy loại đó và các bản dựng một Đăng ký không đầy đủ. Làm thế nào tôi có thể kiểm tra các loại khác trong kịch bản này?Làm thế nào tôi có thể kiểm tra toàn bộ cây nguồn bằng một bộ xử lý chú thích?

+0

Bạn đang sử dụng bộ xử lý chú thích nào? –

+0

Tôi đã tự viết, sử dụng API Java 6 (mở rộng javax.annotation.processing.AbstractProcessor) –

+0

+1. Từ điều tra của riêng tôi, điều này không có sẵn, nhưng nếu tôi thực sự muốn biết về nó. –

Trả lời

6

Tôi đã giải quyết đủ điều này ngay bây giờ. Những gì tôi đã làm là một chút hackey, nhưng về cơ bản cho mọi lớp chú thích tôi thấy, tôi thêm tên của nó vào một HashSet. Sau đó, tôi sử dụng Filer.getResource() để mở một tệp mà tôi đã ghi lại tất cả các lớp được chú thích trước đó, và thêm chúng vào HashSet nữa. Sau đó, tôi tạo ra lớp đăng ký, và viết toàn bộ HashSet ra cùng một tài nguyên với Filer.createResource(). Điều này sẽ gây ra vấn đề nếu tôi xóa một loại chú thích, vì nó sẽ vẫn được ghi lại trong tập tin đó, nhưng tôi chỉ có thể làm sạch dự án hoặc xóa tập tin đó để giải quyết nó.

EDIT: Ngoài ra, tôi tin rằng việc chuyển "các phần tử gốc" thích hợp cho Filer.createSource() sẽ cho phép Eclipse theo dõi những phụ thuộc đó đúng cách, nhưng không. Có lẽ đó là một lỗi của Eclipse.

+0

bạn có muốn mã này được chia sẻ ở mọi nơi không? Tôi quan tâm đến cách tiếp cận của bạn. –

+0

Đây là mã do công ty sở hữu, nhưng nếu tôi từng viết một cái gì đó như thế này cho một dự án cá nhân, nó sẽ có sẵn –

+0

Tôi đã viết [thư viện chung] (https://github.com/sentinelt/evo-classindex) cho điều này. Tôi tìm thấy trang này, bởi vì thư viện của tôi bị cùng một vấn đề ... –

1

Không ngạc nhiên, bộ xử lý chú thích biên dịch chỉ xử lý các tệp đang được biên dịch. Eclipse sử dụng trình biên dịch gia tăng để tiết kiệm thời gian, vì vậy câu trả lời ngắn gọn là bạn không thể mong đợi bộ xử lý chú thích của bạn xem tất cả các loại trong một lần truyền.

Một giải pháp là thay đổi kiến ​​trúc của bạn để hỗ trợ biên dịch gia tăng. Ví dụ: đối với mỗi chú thích HandlerClass, hãy tạo một lớp RegisterHandlerClass đăng ký lớp trình xử lý đó.

Điều đó nói rằng, âm thanh như những gì bạn đang làm sẽ được thực hiện tốt hơn khi chạy, có lẽ với sự trợ giúp của một công cụ như Reflections.

+1

Đây là mã Android và có vẻ như hầu hết các khung công tác đó đều không hoạt động trên Android; trong mọi trường hợp, tôi muốn tránh quét đường dẫn nếu có thể. Nếu tôi đi tuyến đường RegisterHandlerClass, chính xác điều đó sẽ giúp ích như thế nào? Làm thế nào tôi có thể có được những lớp học để đăng ký lớp xử lý thích hợp, mà không cần phải có một "đăng ký của sổ đăng ký" để nói chuyện? –

+0

Nếu vấn đề là các lớp Handler không được nạp, thì ý tưởng RegisterHandlerClass của tôi sẽ không hoạt động. Thay vào đó, bạn có thể tạo một tệp tài nguyên cho mỗi lớp trình xử lý và đặt tất cả chúng trong cùng một thư mục và sau đó chỉ cần quét thư mục đó khi chạy. –

Các vấn đề liên quan