2008-12-04 42 views
6

Tôi có một bước biên dịch sau để thao tác mã Java bytecode của các lớp được tạo ra. Tôi muốn làm cho cuộc sống trở nên không đau đớn đối với người tiêu dùng thư viện, vì vậy tôi đang tìm cách để tôi có thể làm cho quá trình này tự động và (nếu có thể) trình biên dịch bất khả tri.Cắm vào trình biên dịch Java

Annotation Processing API cung cấp nhiều tính năng mong muốn (khám phá dịch vụ tự động; được Eclipse hỗ trợ). Thật không may, điều này là nhằm mục đích phát điện mã và doesn't support manipulation of existing artefacts:

Các đầu vào ban đầu để công cụ này được coi là tạo ra bởi 0 tròn; do đó, cố gắng tạo nguồn hoặc tệp lớp tương ứng cho một trong các yếu tố đầu vào đó sẽ dẫn đến một ngoại lệ FilerException.

Mẫu trang trí được đề xuất bởi API không phải là một tùy chọn.

Tôi có thể xem cách thực hiện bước với đại lý/thiết bị đo thời gian, nhưng đây là một tùy chọn tồi tệ hơn bước xây dựng thủ công vì nó sẽ yêu cầu bất kỳ ai thậm chí cảm ứng ngoại vi bởi API để định cấu hình JVM của họ cách thức.

Có cách nào để cắm hoặc bọc compiler tool như được gọi bởi javac không? Có ai phá hủy thành công bộ xử lý chú thích để thao tác bytecode không, dù tài liệu có nói gì không?

Trả lời

4

Trình biên dịch Groovy là trình biên dịch bytecode chỉ cho phép để móc vào quá trình biên dịch (ví dụ: Generate bytecode to support the Singleton pattern)

Các API xử lý Chú không nhằm mục đích thay đổi mã. Như bạn đã phát hiện ra, tất cả những gì bạn có thể làm là cài đặt một trình nạp lớp, kiểm tra bytecode khi chạy và thao tác nó. Đó là braindead nhưng nó hoạt động. Điều này theo chủ đề chung "chúng tôi sợ rằng một nhà phát triển có thể thử một cái gì đó ngu ngốc" mà bạn sẽ tìm thấy trong suốt Java. Không có cách nào để mở rộng javac. Các lớp có liên quan là riêng tư, cuối cùng hoặc sẽ thay đổi với phiên bản Java tiếp theo.

Một tùy chọn khác là viết chú thích Java, ví dụ bạn viết một lớp "ExampleTpl.java". Sau đó, bạn sử dụng trình biên dịch trước để mở rộng các chú thích trong tệp đó để lấy "Example.java". Trong phần còn lại của mã, bạn sử dụng Example và bỏ qua ExampleTpl.

Đối với Eclipse, có bug report to automate this step. Tôi không biết về bất kỳ công việc nào khác trong lĩnh vực này.

3

Có thể thực hiện được.

Hãy xem bài đăng blog của tôi Roman Numerals, in our Java nơi bộ xử lý chú thích được sử dụng để viết lại mã. Giới hạn là nó chỉ hoạt động với javac của Sun.

+0

Liên kết của bạn đã chết. –

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