Tôi thực sự cuộn lên tay áo của mình và cố gắng hiểu chú thích Java lần đầu tiên và đã đọc bài viết về Sun, Oracle và Wikipedia về chủ đề này. Họ dễ hiểu về khái niệm, nhưng tôi cảm thấy khó khăn khi đặt tất cả các mảnh ghép lại với nhau.Chú thích Java và apt (nguyên tắc cơ bản)
Ví dụ sau đây có lẽ là kỹ thuật khủng khiếp, nhưng chỉ hài hước với tôi (đó là một ví dụ !).
Hãy nói rằng tôi có lớp sau đây:
public Widget { // ... public void foo(int cmd) { switch(cmd) { case 1: function1(); break; case 2: function2(); break; case 3: default: function3(); break; } } }
Bây giờ, ở một nơi khác trong dự án của tôi, tôi có một lớp khác, tàu con thoi, có một phương pháp gọi là blastOff():
public class SpaceShuttle { // ... public void blastOff() { // ... } }
Bây giờ, tôi muốn định cấu hình chú thích được gọi là Widgetize để mọi phương thức được chú thích bằng @Widgetize sẽ có Widget :: foo (int) được gọi trước khi có cuộc gọi của riêng chúng.
@interface Widgetize { int cmd() default 2; }
Vì vậy, bây giờ hãy xem lại tàu con thoi:
public class SpaceShuttle { // ... @Widgetize(3) public void blastOff() { // Since we pass a cmd of "3" to @Widgetize, // Widget::function3() should be invoked, per // Widget::foo()'s definition. } }
Than ôi, câu hỏi của tôi!
Tôi giả định rằng ở đâu đó tôi cần xác định bộ xử lý chú thích; một lớp Java sẽ chỉ định phải làm gì khi các chú thích @Widgetize (int) gặp phải, đúng không? Hay điều này xảy ra trong các tập tin cấu hình XML được đưa vào apt (giống như cách kiến đọc tệp build.xml)?
Chỉnh sửa: Nếu tôi đúng về các bộ xử lý chú thích này ở câu hỏi số 1 ở trên, thì làm cách nào để "lập bản đồ"/"đăng ký"/làm cho các bộ vi xử lý này biết đến apt?
Trong bản dựng, apt thường chạy trước javac, để thay đổi dựa trên chú thích hoặc tạo mã diễn ra trước khi biên dịch? (Đây là câu hỏi kiểu thực hành tốt nhất).
Cảm ơn và tôi xin lỗi vì mẫu mã của tôi, họ hóa ra cồng kềnh hơn nhiều so với tôi dự định họ (!)
Đối với hồ sơ, câu hỏi của bạn là rất rõ ràng. Tôi nghĩ rằng vấn đề bạn sẽ chạy vào một khi bạn đã có apt cấu hình (và lý do tôi đề nghị AOP) là điều này. Nó rất dễ dàng để tạo mã. Tuy nhiên, nó thực sự khó sửa đổi mã. Phần phức tạp ở đây là sửa đổi mã gọi 'spaceShuttle.blastOff()' 'để thực sự gọi đúng phương thức proxy. – Pace