2012-05-07 28 views
25

Tôi muốn chuyển đổi mã nguồn java lúc biên dịch ngay trước khi chuyển mã nguồn tới trình biên dịch. Nói một cách khác Tôi muốn tạo ra một Preprocessor thể chuyển đổiChuyển đổi mã Java tại thời gian biên dịch

"bla bla bla" 

vào bất kỳ mã khác như:

new MyClass("bla", 3) 

động lực thực sự của tôi là để làm mã hóa chuỗi, như explained here

Một số người đề xuất viết bộ xử lý chú thích tùy chỉnh nhưng theo như tôi hiểu chú thích:

  • chúng có thể được sử dụng để tạo tệp lớp mới, nhưng không được chuyển đổi mã hiện có trước khi được chuyển đến trình biên dịch
  • chúng dường như hoạt động ở cấp gói, lớp hoặc phương pháp, chứ không phải là phương pháp/triển khai.

Một số người đề xuất sử dụng các khung như Spoon hoặc ObjectWeb ASM, nhưng các khung này có vẻ phức tạp để tìm hiểu và triển khai trên cơ sở mã hiện có.

Tôi phát triển mạnh để tìm một ví dụ đơn giản về tiền xử lý mã java cho cả hai cách tiếp cận.

Có ai nhìn thấy bất kỳ cách thông minh nào để thực hiện chuyển đổi mã, mà không thay đổi hoàn toàn một cơ sở mã lớn hiện có với nhiều mô-đun ivy? Chú thích dường như là cách tốt nhất, nhưng tôi không hiểu làm thế nào để làm điều đó.

+0

[Jet] (http://www.eclipse.org/articles/Article-JET/jet_tutorial1.html) có thể hữu ích (Tôi không biết trong đó nhà nước có, nhưng làm việc tốt một số năm trước). JavaCC thực hiện theo cách tiếp cận tương tự. – home

+3

Bạn có thể viết một plugin Ant/Mavin tùy chỉnh mà trước tiên sẽ thực hiện việc mã hóa và sau đó biên dịch mã của bạn. – Pushkar

+0

Tôi có cùng một câu hỏi. Bạn có thể chia sẻ những gì bạn đã kết thúc với? – rahulmohan

Trả lời

1

Có một người đã viết một plugin kiến ​​xử nhỏ tiền xử lý giống như C trong python/jython. Bạn có thể tìm thấy nó here. Lưu ý rằng tôi chưa bao giờ sử dụng nó, nhưng có lẽ nó có thể là một điểm khởi đầu tốt cho nhu cầu của bạn.

Ngoài ra còn có một plugin java-comment-preprocessor maven (kiểu tương tự) trong mã google cũng có thể là điểm bắt đầu hữu ích.

Chúc may mắn. Âm thanh như một thử thách thú vị. Tất nhiên, hãy nhớ rằng obfuscation là chỉ làm cho nó một chút khó khăn hơn để giải nén chuỗi, nhưng vẫn không phải là không thể. Nếu bạn thực sự muốn làm cho nó khó khăn hơn, thì bạn có thể muốn xem xét mã hóa các chuỗi của bạn và/hoặc sử dụng AOP.

9

Tôi nghĩ rằng bạn có thể thử các kỹ thuật tương tự được sử dụng trong Project Lombok

Nó xấp xỉ giải thích bởi các tác giả trong this interview:

gì đang xảy ra dưới mui xe? Tức là, kết quả chú thích trong bản mẫu được kết thúc bằng bytecode như thế nào?

Reinier: API bộ xử lý chú thích chỉ cho phép bạn tạo tệp mới, nó không cho phép bạn sửa đổi tệp có chú thích bên trong. Đó là những gì Lombok làm, vì vậy Lombok không sử dụng API bộ xử lý chú thích.

Thay vào đó, Lombok chỉ sử dụng API bộ xử lý chú thích làm cơ chế để tự chèn chính nó vào quá trình biên dịch. Tất cả các bộ xử lý chú thích được khởi tạo sớm trong quá trình biên dịch, và Lombok sửa đổi javac khi nó được khởi tạo như một bộ xử lý chú thích. Chúng tôi chỉ thay đổi một điều: AST (mã nguồn thô, được phân tích thành dạng cây) lần đầu tiên được trao cho Lombok, tạo ra bất cứ thứ gì cần được tạo ra, trước khi javac tiếp tục.

và trong How does lombok work?

Cũng có thể để mở rộng dự án Lombok yêu cầu của bạn