2011-09-04 67 views
6

Chúng tôi có một thư viện mã Java mà chúng tôi dự định sử dụng trong các dự án. Một số dự án này sẽ yêu cầu thêm chú thích vào đối tượng Java trong thư viện này (tức là trong một dự án, các đối tượng này sẽ được sử dụng trong thực thi servlet JAX-RS để chúng cần được chú thích bằng chú thích JAXB, JSON, v.v.). Vấn đề tôi gặp phải là tôi không thể tìm ra cách thêm các chú thích này mà không thay đổi thư viện gốc.Thêm/sửa đổi chú thích trong một dự án java

Hãy xem xét ví dụ sau:

public class MyClass 
{ 
    private String field1; 
    private int field2; 
} 

Trong một số dự án, tôi muốn lớp cư xử như thể nó là

public class MyClass 
{ 
    @Annotation1 
    private String field1; 
    @Annotation2 
    private int field2; 
} 

Ban đầu tôi nghĩ về việc sử dụng các giao diện hoặc các lớp thừa kế được chú thích riêng nhưng không thể tìm ra cách để làm điều đó (hoặc liệu nó có khả thi hay không). Tôi cũng tìm thấy đề xuất Javassist in this thread (tức là cách tiếp cận thao tác bằng bytecode Java) nhưng vấn đề là điều này cũng cần phải hoạt động trên các máy khách Android vì vậy nó không phải là một lựa chọn cho tôi. Tại thời điểm này tôi ra khỏi ý tưởng.

Tôi sẽ đánh giá cao nếu ai đó có thể trợ giúp theo bất kỳ cách nào. Có lẽ tôi đang thiếu một cái gì đó, hoặc có lẽ những gì tôi đang cố gắng làm là không đúng cách. Trong mọi trường hợp, tôi cần một số hướng dẫn ngay bây giờ để tiếp tục.

Cảm ơn rất nhiều trước.

+0

Sự cố khi thay đổi thư viện gốc là gì? Đó là mã của bạn, gần như tôi có thể nói. – CommonsWare

+0

Thư viện quản lý một loạt các đối tượng, bộ sưu tập của chúng và chức năng CRUD trong bộ nhớ (các ràng buộc, xác thực, v.v.). Nó không có bất kỳ kiến ​​thức về serialization và kiên trì của các đối tượng này, và tôi muốn giữ những riêng biệt.Ngoài ra, chú thích không khả dụng có thể gây ra sự cố trên nền tảng đích: Android không có chú thích JAXB và bất kỳ khung nào xử lý chú thích không thành công trên Android mặc dù chú thích JAXB không được sử dụng (NoClassDefFoundError). Tôi muốn tránh thêm chú thích nếu chúng không được sử dụng bởi nền tảng đích. – alokoko

Trả lời

4

Tôi nhìn vào hơn này và như một bản tóm tắt, đây là những gì tôi thấy:

  • ngôn ngữ Java không cho phép thay đổi các chú thích trong thời gian chạy.
  • Người ta có thể sử dụng Javassist để sửa đổi bytecode java nhưng nó không hoạt động trên các nền tảng như Android.
  • Người ta có thể sử dụng ASM nhưng liên quan đến việc giao dịch với Java assembly (ví dụ ở đây: http://community.jboss.org/thread/150002).

Chủ yếu do JAXB không có mặt trên Android (và các lý do khác) mà chúng tôi đã chuyển sang JSON và bắt đầu sử dụng Jackson khi triển khai. Một lợi ích của sự thay đổi này là khả năng sử dụng những gì Jackson gọi là "chú thích hỗn hợp" chính xác là những gì tôi đang tìm kiếm.

Đây là liên kết giải thích thêm: http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html

0

Thiếu hack bytecode .class trong thời gian chạy, điều này không thể thực hiện được. Bạn có thể sử dụng Javassist nếu bạn thực sự muốn tự động thay đổi bytecode của các lớp thư viện trong suốt thời gian chạy nhưng trong bức tranh lớn hơn, điều này có thể sẽ kết thúc một cách dữ dội.

Tôi khuyên bạn chỉ nên chú thích thư viện và biên dịch lại nếu đó là mã của bạn. Nếu không, bạn vẫn có thể bọc các lớp/giao diện thư viện trong các lớp/giao diện của riêng bạn thông qua kế thừa và chú thích ở đó. Dù bằng cách nào, tôi nghĩ rằng nó sẽ là tốt hơn để chú thích trong mã hơn là thông qua thời gian chạy bytecode hack. Thêm tiền thưởng, chú thích trong nguồn sẽ được xem bởi IDE, cho phép IDE hỗ trợ bạn tốt hơn.

+0

Xem nhận xét của tôi cho câu hỏi. Tôi đã biết về Javassist nhưng tôi cũng cần nó làm việc trên nền tảng Android và Javassist không hoạt động trên Android. – alokoko

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