2009-07-16 47 views
9

Tôi nhận ra rằng đây có thể là một câu hỏi đã được hỏi và trả lời, nhưng xin vui lòng chịu đựng với tôi.Có thể sử dụng chú thích để tiêm mã không?

Tôi muốn biết liệu có thể sử dụng chú thích để chèn mã vào thời gian biên dịch các lớp của bạn hay không. Ví dụ cổ điển là tạo ra một getter và setter cho các thành viên của đối tượng của bạn. Đây không phải là chính xác những gì tôi cần nó, nhưng nó phục vụ để minh họa cho ý tưởng cơ bản.

Bây giờ trên internet câu trả lời cơ bản tôi nhận được là không, nhưng anh chàng này đã làm nó:

link text

Có ai biết làm thế nào anh ấy làm những gì anh ấy làm (và nếu anh ta thực sự làm những gì ông nói ông làm)?

Điều chính là anh ấy không sử dụng bộ xử lý chú thích để tạo tệp java mới để biên dịch. Kỹ thuật này tôi biết và sẽ không hoạt động cho mục đích của chúng tôi.

Cảm ơn

+0

Tôi đoán anh ấy có thể làm việc này http://jcp.org/en/jsr/detail?id=269? – Chii

Trả lời

5

Nó không được hỗ trợ để sửa đổi mã tại thời gian biên dịch nhưng có vẻ như có thể bằng cách sử dụng các API nội bộ javac không được hỗ trợ, here là bài đăng tham chiếu giải pháp hanbuy-panno với liên kết đến code ...

+0

Cảm ơn bạn rất nhiều. Đó là liên kết thứ hai chính xác những gì tôi đang tìm kiếm. Bây giờ tôi có thể thấy anh ta làm như thế nào và quyết định xem đó là một ý tưởng tốt hay xấu để làm theo cách đó. –

+0

Các liên kết này không hoạt động nữa. Có gương không? –

1

Something cần để xử lý các chú thích, vì vậy nó hoặc là xảy ra tại thời gian biên dịch với một bộ xử lý chú thích hoặc khi chạy với sự phản ánh (vâng tôi biết, thậm chí có những cách kỳ lạ hơn để làm việc đó trong thời gian chạy).

Anh ấy chắc chắn nhất đang sử dụng bộ xử lý chú thích, nó chỉ là ngầm định. Lệnh javac sẽ tìm kiếm đường dẫn lớp cho bộ xử lý chú thích nếu không được đặt rõ ràng.

Kể từ khi ông sử dụng lệnh này để biên dịch:

javac -cp ~/development/panno/build/hanhuy-panno.jar *.java

Chúng ta thấy ông đã sửa đổi các đường dẫn lớp để bao gồm các hanhuy-panno.jar, mà sẽ chứa bộ vi xử lý chú thích.

Tại sao không chỉ gửi email cho anh chàng và hỏi xem anh ấy có đưa mã cho bạn không?

+0

Vâng, tôi nhận ra rằng anh ta làm điều đó bằng cách sử dụng một bộ xử lý chú thích, câu hỏi là nhiều hơn những gì anh ta làm trong đó. Tôi đã gửi thư cho anh ấy, nhưng tôi chưa nhận được thư trả lời. Cảm ơn bạn –

3

Tôi đã tìm kiếm something similar năm ngoái. Không có cách thức tiêu chuẩn nào để thay đổi các lớp bằng cách sử dụng các bộ xử lý chú thích hoặc trình biên dịch và tài liệu API chú thích đề xuất tạo các trình trang trí.

Nếu bạn sẵn sàng sống với hacks, hãy xem sử dụng API riêng tư của Adrian Kuhn nơi ông adds Roman numeral literals to Java. Cách tiếp cận này được giới hạn trong trình biên dịch javac của Sun và bạn sẽ cần phải thực hiện một cái gì đó khác nếu bạn sử dụng một trình khác (như trình biên dịch Eclipse).


Chỉnh sửa: bất kỳ ai quan tâm đến khu vực này đều nên kiểm tra Project Lombok.

+0

Ah, tôi hiểu ý của bạn về việc giới hạn bản thân với một trình biên dịch nào đó. Điều đó có thể là vấn đề. Cảm ơn vì sự trả lời. –

2

Bạn có thể thực hiện việc này, nhưng bạn không được phép sửa đổi lớp chứa chú thích. (Bí quyết bạn liên kết để sử dụng api cây biên dịch để sửa đổi mã byte được tạo ...) Điều này không được hỗ trợ và có thể sẽ được bảo vệ trong các SDK Java sau này.

Cách thích hợp để làm điều đó là tạo lớp cha, lớp con hoặc lớp trình bao bọc.

Tôi đã viết một bộ chú thích tạo ra getters/setters và các nội dung thú vị khác. Tôi tạo ra một siêu lớp.

Xem http://code.google.com/p/javadude/wiki/Annotations

Bạn có thể làm những việc như

package sample; 

import com.javadude.annotation.Bean; 
import com.javadude.annotation.Property; 
import com.javadude.annotation.PropertyKind; 

@Bean(properties={ 
    @Property(name="name"), 
    @Property(name="phone", bound=true), 
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST) 
}) 
public class Person extends PersonGen { 
} 

và nó sẽ tạo ra PersonGen cho bạn với các lĩnh vực/getters/setters và hỗ trợ tài sản bị ràng buộc.

+0

Cảm ơn bạn đã phản hồi, nhưng như tôi đã nêu trong câu hỏi ban đầu của mình, việc tạo các tệp java khác không phải là giải pháp lý tưởng trong trường hợp của chúng tôi. Mặc dù, tôi đồng ý rằng việc sử dụng api cây biên dịch cũng không lý tưởng. –

+0

Bất kỳ gen mã lý do cụ thể nào sẽ không hoạt động cho bạn? Hãy nhớ rằng không chỉ api mã nguồn không lý tưởng cho mục đích này, nó được nêu rõ trong các tài liệu APT rằng nó là bất hợp pháp. –

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