2008-11-14 31 views
15

Tôi biết về BCEL, nhưng dự án này dường như đã chết, vì nó không có bản phát hành trong hai năm. Và thế giới Java chuyển động. Ví dụ JDK 1.6 có một định dạng tập tin lớp mới.Thư viện/chương trình nào có thể được sử dụng để tạo Java bytecode?

Vì vậy, thư viện nào có thể được sử dụng để tạo bytecode cho JVM. Nếu không có thư viện, một chương trình cũng được chấp nhận, nếu tôi có thể thao tác mã được tạo một cách chi tiết, ví dụ như một bộ mã hóa bytecode.

Bạn có thể giới thiệu phần mềm nào? Có dễ sử dụng không? có các ví dụ/hướng dẫn tốt?

EDIT: Đối với tất cả yêu cầu: Có, javac là tốt. Nhưng để tạo ra một số lớp trong thời gian chạy, một đường dẫn trực tiếp tới bytecode sẽ sạch hơn.

Trả lời

19

ASM

http://asm.objectweb.org/

Nó là nhanh hơn nhiều so với BCEL và hỗ trợ Generics và chú thích. Một điểm về kiến ​​trúc của nó: để đảm bảo ASM hiệu năng cao được xây dựng xung quanh một trình phân tích cú pháp để ném các sự kiện (trái ngược với BCEL nơi trình phân tích cú pháp xây dựng một cấu trúc dữ liệu). Điều này hơi giống với sự khác biệt giữa các trình phân tích SAX và DOM. Phải mất một số thực hành để làm quen với loại tư duy này.

EDIT (Theo nhận xét của McDowell): Thực tế khách truy cập được sử dụng nhiều trong ASM, nhưng nó lớn hơn khách truy cập đơn giản: cấu trúc dữ liệu được truy cập được tạo bởi trình phân tích cú pháp, vì vậy nếu bạn không quan tâm đến một số phần nhất định của tệp lớp (ví dụ, bạn muốn biết tên của các phương thức nhưng bạn không quan tâm đến cơ thể của chúng), bạn có thể trả về một null từ phương thức visitMethod(). Điều này sẽ làm cho trình phân tích cú pháp bỏ qua các phần thân của phương thức do đó ngăn cản việc xây dựng (đắt tiền) của mạng của các đối tượng mô tả đầy đủ phương thức.

+0

Tôi nghĩ rằng bằng cách "ném các sự kiện", Itay có nghĩa là nó sử dụng mẫu khách truy cập. Tôi đang cố gắng ASM tại thời điểm này - nó là khá tốt và có doc tốt. Nếu bạn muốn hỗ trợ chú thích trong BCEL, bạn cần phải xây dựng các nguồn mới nhất. – McDowell

+0

Nếu bạn không yêu cầu hiệu suất nhanh, ASM cũng cung cấp giao diện dựa trên cây giống DOM. –

-2

Tôi nghĩ yêu thích tác giả java bytecode của tôi được gọi javac và bạn có thể tìm thấy nó ở www.sun.com

+0

Tôi có cảm giác rằng Mnementh đang hỏi về điều gì khác và chúng tôi gặp phải vấn đề về từ vựng. – Karl

-3

Tại sao không sử dụng trình biên dịch Java, javac? Có gì sai khi sử dụng nó để tạo mã byte JVM?

[Nghiêm túc. Cách nào ngăn cản bạn từ việc nguồn của bạn, làm cho Java và biên dịch nó?]

+0

Có một số trường hợp bạn muốn tạo bytecode theo chương trình. Nếu điều này là trên máy tính của người dùng, bạn không thể giả định rằng họ đã cài đặt đầy đủ JDK. –

+0

Gặp sự cố khi tưởng tượng một ứng dụng thật tuyệt vời đến nỗi nó yêu cầu trình biên dịch, nhưng không đủ mát để đưa nó vào phần tải xuống. Mặc dù về mặt kỹ thuật, nó có vẻ khó xảy ra. –

+0

Một ứng dụng phổ biến là biên dịch các ngôn ngữ khác với Java bytecode. Các tập lệnh mở rộng thứ gì đó như trò chơi hoặc trình chỉnh sửa ảnh có thể cần hiệu suất của mã được biên dịch. Và, Java 7 có khả năng bao gồm bytecode không thể được tạo ra bởi một chương trình Java hợp lệ (gọi là động lực cho các lang động). – erickson

2

Javassistcglib là hai thư viện kỹ thuật bytecode tốt. Chúng được sử dụng rộng rãi trong thế giới Java EE để tạo proxy của các đối tượng trong thời gian chạy. Hibernate và Spring là hai khung công tác hàng đầu sử dụng các thư viện này.

1

Có những công nghệ như asm và cglib nhưng tôi khuyên bạn nên Javaassist vì nó là một thư viện rất tốt cho điều đó và bạn có thể tìm thấy các ví dụ trong khuôn khổ tapestry5.

4

Có một ví dụ khá hoàn chỉnh về việc sử dụng ASM để tạo mã byte từ một ngôn ngữ trung gian giống như Java trong việc triển khai CAL (một ngôn ngữ giống như Haskell cho JVM). Nếu bạn tải xuống các nguồn tại số http://openquark.org/Open_Quark/Download.html thì bạn có thể tìm thấy mã trong AsmJavaByteCodeGenerator.java và các lớp mô hình java trong cùng một thư mục. Mã được tạo ra về cơ bản là những gì javac sẽ làm, trừ các chú thích gỡ lỗi. Việc thực hiện CAL ban đầu được sử dụng BCEL nhưng chuyển sang ASM vì ASM nhanh hơn đáng kể (có thể là một thứ tự độ lớn), và chỉ đáng kể ASM là luồng an toàn, do đó có thể biên dịch đồng thời là cần thiết bởi CAL.

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