2008-10-13 37 views
10

Làm thế nào tôi có thể tạo ra bytecode (Byte []) từ một chuỗi tại thời gian chạy, mà không cần sử dụng một "javac" quá trình hoặc một cái gì đó của loại này? là có một cách đơn giản để gọi trình biên dịch như thế?java trong bộ nhớ biên soạn

bổ sung sau:

Tôi đã chọn accept the solution that actually best fits my situation. ứng dụng của tôi là một dự án sở thích vẫn còn trong giai đoạn phác thảo thiết kế, và đó là thời điểm thích hợp để xem xét việc chèn công nghệ mới. Ngoài ra, vì anh chàng đó có nghĩa vụ giúp tôi với BL là một nhà phát triển JavaScript, ý tưởng sử dụng trình thông dịch JavaScript thay vì trình biên dịch sơ khai + classLoader dường như hấp dẫn hơn với tôi trong tình huống này. khác (không được chấp nhận) câu trả lời của câu hỏi này là thông tin và, theo như tôi có thể nói, trả lời câu hỏi của tôi rất tốt, vì vậy cảm ơn, nhưng tôi sẽ cố gắng Rhino :)

Trả lời

4

Bạn có thể tìm thấy một cái gì đó như tê giác hoặc groovy hữu ích hơn trong thực tế.

+0

Mặc dù bạn không trả lời một cách kỹ thuật câu hỏi của mình, bạn đã mở ra một khả năng mới cho tôi, rằng tôi nghĩ S W hữu ích hơn trong thực tế (mặc dù nó đòi hỏi phải học thêm). (+ upvove) –

+1

Có lẽ tôi nên có một chút rõ ràng hơn rằng tôi đã đi qua cùng một quá trình suy nghĩ bản thân mình. Tôi đã kết thúc bằng cách sử dụng tê giác vì nó bây giờ là một phần của JDK. Chúc may mắn – Draemon

0

Bạn có thể truy cập trình biên dịch miễn là tệp tools.jar từ JDK của bạn nằm trên đường dẫn lớp. Tài liệu cho nó là here. API không đơn giản như eval() ở một số ngôn ngữ thông dịch nhưng có ở đó.

Bạn cũng có thể phải tham gia vào một số mã ClassLoader lạ để thực sự chạy mã đó, tôi không hoàn toàn chắc chắn về điều đó.

12

JDK6 có Java compiler API. Tuy nhiên, nó không nhất thiết phải rất dễ sử dụng.

Một google nhanh chóng kéo lên this example usage.

+1

Cảm ơn bạn đã liên kết! Tìm thấy ví dụ này mà làm việc thực sự tốt cho tôi: http://www.javablogging.com/dynamic-in-memory-compilation/ – Peter

6

Tôi nghĩ rằng ảnh đẹp nhất của bạn sẽ là Janino. Điều đó sẽ cho phép bạn biên dịch mã khi chạy và gọi nó từ phần còn lại của chương trình của bạn. Chúng tôi sử dụng nó trong một số hệ thống của chúng tôi để cho phép chúng tôi cập nhật động một số lớp học.

Nó không miễn phí. Nó hoạt động tốt, nhưng nó sử dụng không gian permgen mỗi khi bạn tải một lớp mới (hoặc phiên bản của một lớp), do đó bạn sẽ hết bộ nhớ nếu bạn có một quá trình chạy (thực sự) dài (hoặc thứ gì đó tải nhiều lớp mới)) nhưng bạn có thể thay đổi lượng không gian permgen trong JVM để di chuyển rào cản đó ra ngoài nếu đó là vấn đề.

Janino thực sự là một trình biên dịch, nhưng bạn có thể thấy cách nó chèn mã byte nếu bạn cần vận hành ở cấp đó. Bạn có thể cần phải tạo một trình nạp lớp hoặc sử dụng API trình biên dịch Java như Tom Hawtin đã đề xuất.

+0

Tôi đã sử dụng Janino cho một dự án. Nó có một số hạn chế nhưng nó hoạt động tốt. Đó là LPGL cho những gì tôi biết ... –

+0

@Mario Ortegón: Đồng ý. Chúng tôi đã sử dụng phiên bản cũ hơn một chút không hỗ trợ bất kỳ tính năng Java 1.5 nào gây đau. Họ đã cải thiện điều đó, mặc dù một số (như cú pháp for (object: collection)) vẫn còn thiếu. – MBCook