2008-10-02 34 views
12

Tôi đang làm việc trên một dự án mà chúng tôi đang thực hiện rất nhiều chuyển đối tượng từ xa giữa dịch vụ Java và các ứng dụng khách được viết bằng các ngôn ngữ khác nhau. Với các ràng buộc hiện tại của chúng tôi, tôi đã quyết định xem nó sẽ làm gì để tạo ra mã dựa trên một lớp Java hiện có. Về cơ bản tôi cần lấy một tập tin .class (hoặc một bộ sưu tập của chúng) phân tích cú pháp bytecode để xác định tất cả các thành viên dữ liệu và có lẽ getters/setters và sau đó viết một cái gì đó có thể xuất mã bằng một ngôn ngữ khác để tạo ra một lớp với cùng cấu trúc .Kiểm tra theo lập trình các tệp .class

Tôi không tìm kiếm các trình giải mã chuẩn như JAD. Tôi cần để có thể lấy một tập tin .class và tạo ra một mô hình đối tượng của các thành viên và phương thức dữ liệu của nó. cái này nó có hoàn toàn có thể xảy ra được không?

Trả lời

12

Tôi đã sử dụng BCEL và thấy nó thực sự khá khó xử. ASM tốt hơn nhiều. Nó rất rộng rãi sử dụng khách truy cập (có thể hơi khó hiểu) và không tạo ra một mô hình đối tượng. Việc không tạo ra một mô hình đối tượng hóa ra lại là một phần thưởng, vì bất kỳ mô hình nào bạn muốn tạo ra đều không giống như một cách diễn giải theo nghĩa đen của tất cả các dữ liệu.

+2

+1 cho ASM trên BCEL. API đẹp hơn nhiều. – skaffman

+1

Thực ra, ASM cung cấp mô hình đối tượng nếu bạn muốn. Xem API cây của họ. –

+0

Sau khi đánh giá tất cả các tùy chọn được liệt kê ở đây cho đến nay, ASM chắc chắn là IMHO đẹp nhất để kiểm tra các tệp .class. Tôi đồng ý rằng mô hình khách truy cập sạch hơn nhiều so với mô hình BCEL. Cảm ơn vì tiền hỗ trợ. –

1

Tôi đã sử dụng BCEL trong quá khứ và khá dễ sử dụng. Nó đã được một vài năm trước đây để có thể có một cái gì đó tốt hơn bây giờ.

Apache Jakarta BCEL

+0

Wow, bạn thực sự đánh tôi để trả lời câu hỏi của riêng tôi. Đó là lựa chọn mặc định của tôi, tôi sẽ đặt một câu hỏi và tự mình trả lời và xem có ai khác có ý tưởng hay hơn không. Cảm ơn. –

0

Tôi nghĩ rằng người yêu thích cũng có thể giúp bạn.

http://www.jboss.org/javassist/

Tôi chưa bao giờ có nhu cầu sử dụng nó, nhưng nếu bạn cung cấp cho nó một thử, bạn sẽ cho chúng tôi biết ý kiến ​​của bạn về nó?

Mặc dù tôi nghĩ rằng đó là nhiều hơn cho thao tác bytecode so với kiểm tra .class.

1

Từ mô tả của bạn, có vẻ như simple reflection là đủ. Bạn có thể khám phá tất cả cấu trúc tĩnh của lớp, cũng như truy cập vào các trường của một cá thể cụ thể.

Tôi sẽ chỉ chuyển sang BCEL nếu bạn đang cố dịch các chỉ dẫn phương thức. (Và nếu đó là những gì bạn đang cố gắng tự động hóa, chúc may mắn!)

+0

Phản ánh trong khi một giải pháp có thể, ít hơn lý tưởng. Tôi muốn có thể chỉ ra một tệp .class tùy ý và giải mã nó. Nếu tôi sử dụng sự phản chiếu, tôi sẽ phải lấy Classloader để nạp lớp trước khi tôi bắt đầu làm việc với nó. –

1

JAD là trình giải mã java không cho phép truy cập có lập trình. Nó không có sẵn nữa, và có lẽ sẽ không làm việc cho các dự án mới hơn với các bytecode Java7.

+0

JAD là trình biên dịch ngược, tôi cần một cái gì đó hoạt động theo chương trình. –

+0

FYI, liên kết này đã chết ... – hichris123

+0

Đã sửa lỗi liên kết này, đã thêm văn bản khác. –

1

Tôi bị sốc rằng chưa có ai đề cập đến ASM. Đó là thư viện bytecode tốt nhất mà tiền của bạn có thể mua. Vâng, ok nó miễn phí.

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