2010-04-23 42 views
7

Sử dụng hợp pháp nào cho thao tác bytecode và cách mọi người thực hiện các giải pháp dựa trên thao tác bytecode đó trong thực tế?Các mẫu thao tác Bytecode

Cập nhật: Tôi nên làm rõ hơn rằng câu hỏi này thực sự là về các mô hình và kỹ thuật mọi người sử dụng để làm cho mã của họ bay với sự trợ giúp của thao tác bytecode.

Điều gì đó giống như lập trình hướng khía cạnh đã được đề cập hoặc xây dựng các đối tượng proxy khi đang di chuyển và các kỹ thuật tương tự.

Trả lời

8

Bytecode thao tác cho phép bạn thực hiện biến đổi chương trình tùy tiện phức tạp (và thú vị), chẳng hạn như:

  • nhập mã/lối khai thác gỗ cho các chức năng chọn
  • biến đổi bảo mật còn sơ khai ra quyền truy cập vào một số API của
  • Thay thế API cho, ví dụ: chạy mã trong khai thác thử nghiệm.

Phạm vi là vô hạn; đây chỉ là một mẫu nhỏ.

Cách thực hiện việc này thường bắt đầu từ here.

+0

Có lẽ tôi cần phải rõ ràng hơn về điều này. Tôi đã biết những thư viện đó và tôi biết Java hoạt động như thế nào trên cấp độ bytecode. Điều tôi thực sự muốn biết là những kỹ thuật thú vị mà mọi người đã phát minh ra để làm những việc bạn không thể làm khác, vì vậy tôi có những giải pháp đó trong đầu khi tôi vấp phải những vấn đề như vậy. – ahe

4

Vì vậy, người ta có thể đọc bytecode để triển khai trình thông dịch/JVM. Người ta có thể viết/tạo bytecode khi triển khai trình biên dịch Java hoặc trình biên dịch cho một ngôn ngữ khác sẽ nhắm mục tiêu đến JVM (ví dụ: ScalaJython). Bạn có thể thực hiện thao tác bytecode để tối ưu hóa bytecode (nếu bạn muốn sản xuất và tiếp thị một trình tối ưu hóa bytecode hoặc bạn cần nó như một công cụ nội bộ để cung cấp cho mã của công ty bạn một lợi thế cạnh tranh). Trong một tĩnh mạch tương tự, bạn có thể thao tác bytecode để làm xáo trộn nó trước khi phân phối. Bạn cũng có thể thực hiện thao tác bytecode cho aspect-oriented programming; ví dụ, bạn có thể muốn chèn các móc (có thể cho mục đích định thời hoặc ghi nhật ký hoặc vì một số lý do khác), và nếu nó đơn giản hơn hoặc ít tốn kém hơn để thao tác bytecode hơn là chỉnh sửa tất cả các tệp nguồn (chẳng hạn như trường hợp nếu mã nguồn không có sẵn hoặc từ nhiều nguồn khác nhau, không phải tất cả các nguồn có thể nằm dưới sự kiểm soát của ai hoặc có thể tốn kém và tốn thời gian để thuyết phục các đội đó thêm móc), đây có thể là trường hợp có nghĩa là chèn các sửa đổi vào đầu ra bytecode cuối cùng thay vì cố gắng sửa đổi mã gốc (có thể yêu cầu upstreaming hoặc duy trì một ngã ba riêng biệt hoặc mua mã nguồn từ bên thứ ba chỉ cung cấp bytecode).

Bạn có thể tự mình thao tác bytecode, mặc dù có nhiều thư viện và khung công tác nguồn mở hiện có để làm điều đó, bao gồm BCELASM để đặt tên chỉ là một cặp vợ chồng.

+0

"nó sẽ ít tốn kém hơn để thao tác bytecode hơn là chỉnh sửa tất cả các tệp nguồn" - Làm thế nào? – kgdinesh

+1

@DineshBabu được sửa lại, cung cấp một số ví dụ để làm rõ –

+0

Cảm ơn nhưng cách thao tác mã byte xuất hiện dưới dạng mẫu thiết kế? Nếu chúng ta đi ra khỏi lĩnh vực của Java và nói về ngôn ngữ lập trình nói chung, không phải ai cũng có tính năng này. Làm thế nào để họ hoàn thành công việc? – kgdinesh

3

Có các giấy tờ Patterns of Aspect-Oriented Design (PDF) và Aspect-Oriented Design Principles: Lessons from Object-Oriented Design (PDF) mô tả một số mẫu cho thao tác AOP/bytecode.

Cá nhân tôi đã sử dụng thao tác bytecode với ASM trong one framework để tạo một số mã bản mẫu cho các lớp sử dụng khung đó. Khung yêu cầu các phương thức equals() và hashCode() tùy chỉnh cho mã máy khách, vì vậy tôi generate those bằng cách móc vào một Java Agent để sửa đổi bytecode khi ClassLoader nạp các lớp.Tôi cũng đã sử dụng nhiều lần CGLIB để tạo proxy động (nếu được tính là AOP).

0

Một số khuôn khổ như BEA KODO (Thực hiện đặc tả Java Data Objects) sử dụng thao tác bytecode để "nâng cao" đối tượng Java cũ đơn giản và thêm logic kiên trì, dựa trên mô tả XML.

Do đó, thông tin ánh xạ cơ sở dữ liệu sau đó được tạo tự động trên bytecode.