Động lực học lập trình Java, Phần 7: Kỹ thuật bytecode với BCEL Apache BCEL cho phép bạn đi đến các chi tiết về ngôn ngữ assembler của JVM cho hoạt động lớp
Số trang: 24
Loại file: pdf
Dung lượng: 276.94 KB
Lượt xem: 13
Lượt tải: 0
Xem trước 3 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc. Tóm tắt: Apache Byte Code Engineering Library (BCEL-Thư viện kỹ thuật mã byte) cho phép bạn nghiên cứu bytecode của các lớp Java. Bạn có thể sử dụng nó để biến đổi các biểu diễn lớp hiện tại hoặc xây dựng các lớp mới, và vì BCEL làm việc ở mức các lệnh JVM riêng biệt, nó sẽ cho bạn sức mạnh tối đa trên mã của bạn. Mặc dù sức mạnh đó đi kèm với một chi phí về độ phức tạp. ...
Nội dung trích xuất từ tài liệu:
Động lực học lập trình Java, Phần 7: Kỹ thuật bytecode với BCEL Apache BCEL cho phép bạn đi đến các chi tiết về ngôn ngữ assembler của JVM cho hoạt động lớp Động lực học lập trình Java, Phần 7: Kỹ thuật bytecode với BCEL Apache BCEL cho phép bạn đi đến các chi tiết về ngôn ngữ assembler của JVM cho hoạt động lớp Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc. Tóm tắt: Apache Byte Code Engineering Library (BCEL-Thư viện kỹ thuật mã byte) cho phép bạn nghiên cứu bytecode của các lớp Java. Bạn có thể sử dụng nó để biến đổi các biểu diễn lớp hiện tại hoặc xây dựng các lớp mới, và vì BCEL làm việc ở mức các lệnh JVM riêng biệt, nó sẽ cho bạn sức mạnh tối đa trên mã của bạn. Mặc dù sức mạnh đó đi kèm với một chi phí về độ phức tạp. Trong bài này, nhà tư vấn Java Dennis Sosnoski cung cấp cho bạn những điều cơ bản về BCEL và hướng dẫn bạn thông qua một ví dụ ứng dụng BCEL để cho bạn có thể tự quyết định xem sức mạnh có tương xứng với sự phức tạp không. Trong ba bài viết mới đây của loạt bài này, tôi đã cho bạn thấy cách sử dụng khung công tác Javassist cho hoạt động lớp (classworking). Bây giờ tôi sẽ trình bày một cách tiếp cận rất khác để xử lí bytecode, đó là sử dụng Apache Byte Code Engineering Library (BCEL). BCEL hoạt động ở mức các lệnh JVM thực sự, không giống như giao diện mã nguồn được Javassist hỗ trợ. Cách tiếp cận mức thấp làm cho BCEL rất tốt khi bạn thực sự muốn kiểm soát mọi bước thực hiện chương trình, nhưng nó cũng làm cho hoạt động với BCEL phức tạp hơn nhiều so với sử dụng Javassist cho các trường hợp ở đó cả hai cùng làm việc. Tôi sẽ bắt đầu bằng cách trình bày kiến trúc BCEL cơ bản, sau đó dành hầu hết bài viết này cho việc xây dựng lại ví dụ hoạt động lớp Javassist đầu tiên của tôi bằng BCEL. Tôi sẽ kết thúc bằng việc xem xét một số các công cụ có trong gói BCEL và một vài ứng dụng mà các nhà phát triển đã xây dựng ở trên BCEL. Truy cập lớp BCEL BCEL cung cấp cho bạn tất cả các khả năng cơ bản giống như Javassist kiểm tra, chỉnh sửa và tạo các lớp Java nhị phân. Sự khác biệt rõ ràng với BCEL là mọi thứ được thiết kế để làm việc ở mức ngôn ngữ chương trình dịch hợp ngữ (assembler) của JVM, hơn là giao diện mã nguồn do Javassist cung cấp. Có một số khác biệt sâu hơn dưới các vỏ bọc, gồm việc sử dụng hai hệ thống phân cấp riêng của các thành phần trong BCEL -- một cái kiểm tra mã hiện có và cái khác để tạo mã mới. Tôi sẽ giả định bạn quen với Javassist từ những bài viết trước trong loạt bài này (xem phần bên cạnh Đừng bỏ lỡ phần còn lại của loạt bài này). Vì vậy tôi sẽ tập trung vào những sự khác biệt có khả năng gây nhầm lẫn cho bạn khi bạn bắt đầu làm việc với BCEL. Như với Javassist, các khía cạnh kiểm tra lớp của BCEL về cơ bản lặp lại những gì có sẵn trực tiếp trong nền tảng Java qua Reflection API. Điều trùng lắp này là cần thiết trong một bộ công cụ hoạt động lớp vì bạn thường không muốn nạp các lớp mà bạn đang làm việc với chúng cho đến sau khi chúng đã được thay đổi. Đừng bỏ lỡ phần còn lại của loạt bài này Phần 1, Các lớp Java và nạp lớp (04.2003) Phần 2, Giới thiệu sự phản chiếu (06.2003) Phần 3, Ứng dụng sự phản chiếu (07.2003) Phần 4, Chuyển đổi lớp bằng Javassist (09.2003) Phần 5, Việc chuyển các lớp đang hoạt động (02.2004) Phần 6, Các thay đổi hướng-khía cạnh với Javassist (03.2004) Phần 8, Thay thế sự phản chiếu bằng việc tạo mã (06.2004) BCEL cung cấp một số định nghĩa không thay đổi cơ bản trong gói org.apache.bcel, nhưng không kể những định nghĩa này, tất cả các mã kiểm tra có liên quan nằm trong gói org.apache.bcel.classfile. Điểm khởi đầu trong gói này là lớp JavaClass. Lớp này đóng vai trò giống như trong việc truy cập thông tin lớp bằng cách sử dụng BCEL như lớp java.lang.Class thực hiện khi dùng sự phản chiếu của Java chuẩn. JavaClass xác định các phương thức để nhận được thông tin trường và phương thức cho lớp này, cũng như thông tin theo cấu trúc về siêu lớp và các giao diện. Không giống như java.lang.Class, JavaClass cũng cung cấp quyền truy cập tới các thông tin nội bộ cho lớp đó, gồm nhóm hằng số và các thuộc tính và biểu diễn lớp nhị phân đầy đủ như một luồng byte. Các cá thể JavaClass thường được tạo bằng cách phân tích cú pháp lớp nhị phân hiện có. BCEL cung cấp lớp org.apache.bcel.Repositoryđể thực hiện phân tích cú pháp cho bạn. Theo mặc định, BCEL phân tích cú pháp và lưu trữ nhanh các biểu diễn của các lớp được tìm thấy trong đường dẫn lớp (classpath) JVM, nhận được các biểu diễn lớp nhị phân thực sự từ một cá thể org.apache.bcel.util.Repository (lưu ý sự khác biệt trong tên gói). Hiện tại org.apache.bcel.util.Repository là một giao diện cho một nguồn biểu diễn lớp nhị phân. Bạn có thể thay thế các đ ường dẫn khác để tìm kiếm các tệp lớp hoặc các cách truy cập thông tin lớp khác, thay cho nguồn mặc định có sử dụng đường dẫn lớp. Thay đổi các lớp Bên cạnh việc truy cập kiểu-phản chiếu tới các thành phần lớp, org.apache.bcel.classfile.JavaClass cũng cung cấp các phương thức để thay đổi lớp đó. Bạn có thể sử dụng những phương thức này để thiết lập bất kỳ các thành phần lớp này với các giá trị mới. Mặc dù, chúng thường không sử dụng trực tiếp, vì các lớp khác trong gói đó không hỗ trợ cho việc xây dựng các phi ên bản mới của các thành phần theo bất kỳ cách hợp lý nào. Thay vào đó, có một tập riêng biệt đầy đủ các lớp trong gói org.apache.bcel.generic để cung cấp phiên bản có thể chỉnh sửa được của các thành phần được các lớp org.apache.bcel.classfile biểu diễn. Cũng như org.apache.bcel.classfile.JavaClass là điểm khởi đầu cho việc sử dụng BCEL để kiểm tra các lớp hiện có, org.apache.bcel.generic.ClassGen là điểm bắt đầu của bạn để tạo các lớp mới. Nó cũng thay đổi các lớp hiện tại -- để xử lý trường hợp đó, có một hàm tạo lấy một cá thể JavaClass và sử dụng nó để khởi tạo thông tin lớp ClassGen. Một khi bạn đã hoàn tất các thay đổi lớp của bạn, bạn có thể nhận được một sự biểu diễn lớp thích hợp từ cá thể ClassGen bằng cách gọi một phương thức trả về một JavaClass, n ...
Nội dung trích xuất từ tài liệu:
Động lực học lập trình Java, Phần 7: Kỹ thuật bytecode với BCEL Apache BCEL cho phép bạn đi đến các chi tiết về ngôn ngữ assembler của JVM cho hoạt động lớp Động lực học lập trình Java, Phần 7: Kỹ thuật bytecode với BCEL Apache BCEL cho phép bạn đi đến các chi tiết về ngôn ngữ assembler của JVM cho hoạt động lớp Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc. Tóm tắt: Apache Byte Code Engineering Library (BCEL-Thư viện kỹ thuật mã byte) cho phép bạn nghiên cứu bytecode của các lớp Java. Bạn có thể sử dụng nó để biến đổi các biểu diễn lớp hiện tại hoặc xây dựng các lớp mới, và vì BCEL làm việc ở mức các lệnh JVM riêng biệt, nó sẽ cho bạn sức mạnh tối đa trên mã của bạn. Mặc dù sức mạnh đó đi kèm với một chi phí về độ phức tạp. Trong bài này, nhà tư vấn Java Dennis Sosnoski cung cấp cho bạn những điều cơ bản về BCEL và hướng dẫn bạn thông qua một ví dụ ứng dụng BCEL để cho bạn có thể tự quyết định xem sức mạnh có tương xứng với sự phức tạp không. Trong ba bài viết mới đây của loạt bài này, tôi đã cho bạn thấy cách sử dụng khung công tác Javassist cho hoạt động lớp (classworking). Bây giờ tôi sẽ trình bày một cách tiếp cận rất khác để xử lí bytecode, đó là sử dụng Apache Byte Code Engineering Library (BCEL). BCEL hoạt động ở mức các lệnh JVM thực sự, không giống như giao diện mã nguồn được Javassist hỗ trợ. Cách tiếp cận mức thấp làm cho BCEL rất tốt khi bạn thực sự muốn kiểm soát mọi bước thực hiện chương trình, nhưng nó cũng làm cho hoạt động với BCEL phức tạp hơn nhiều so với sử dụng Javassist cho các trường hợp ở đó cả hai cùng làm việc. Tôi sẽ bắt đầu bằng cách trình bày kiến trúc BCEL cơ bản, sau đó dành hầu hết bài viết này cho việc xây dựng lại ví dụ hoạt động lớp Javassist đầu tiên của tôi bằng BCEL. Tôi sẽ kết thúc bằng việc xem xét một số các công cụ có trong gói BCEL và một vài ứng dụng mà các nhà phát triển đã xây dựng ở trên BCEL. Truy cập lớp BCEL BCEL cung cấp cho bạn tất cả các khả năng cơ bản giống như Javassist kiểm tra, chỉnh sửa và tạo các lớp Java nhị phân. Sự khác biệt rõ ràng với BCEL là mọi thứ được thiết kế để làm việc ở mức ngôn ngữ chương trình dịch hợp ngữ (assembler) của JVM, hơn là giao diện mã nguồn do Javassist cung cấp. Có một số khác biệt sâu hơn dưới các vỏ bọc, gồm việc sử dụng hai hệ thống phân cấp riêng của các thành phần trong BCEL -- một cái kiểm tra mã hiện có và cái khác để tạo mã mới. Tôi sẽ giả định bạn quen với Javassist từ những bài viết trước trong loạt bài này (xem phần bên cạnh Đừng bỏ lỡ phần còn lại của loạt bài này). Vì vậy tôi sẽ tập trung vào những sự khác biệt có khả năng gây nhầm lẫn cho bạn khi bạn bắt đầu làm việc với BCEL. Như với Javassist, các khía cạnh kiểm tra lớp của BCEL về cơ bản lặp lại những gì có sẵn trực tiếp trong nền tảng Java qua Reflection API. Điều trùng lắp này là cần thiết trong một bộ công cụ hoạt động lớp vì bạn thường không muốn nạp các lớp mà bạn đang làm việc với chúng cho đến sau khi chúng đã được thay đổi. Đừng bỏ lỡ phần còn lại của loạt bài này Phần 1, Các lớp Java và nạp lớp (04.2003) Phần 2, Giới thiệu sự phản chiếu (06.2003) Phần 3, Ứng dụng sự phản chiếu (07.2003) Phần 4, Chuyển đổi lớp bằng Javassist (09.2003) Phần 5, Việc chuyển các lớp đang hoạt động (02.2004) Phần 6, Các thay đổi hướng-khía cạnh với Javassist (03.2004) Phần 8, Thay thế sự phản chiếu bằng việc tạo mã (06.2004) BCEL cung cấp một số định nghĩa không thay đổi cơ bản trong gói org.apache.bcel, nhưng không kể những định nghĩa này, tất cả các mã kiểm tra có liên quan nằm trong gói org.apache.bcel.classfile. Điểm khởi đầu trong gói này là lớp JavaClass. Lớp này đóng vai trò giống như trong việc truy cập thông tin lớp bằng cách sử dụng BCEL như lớp java.lang.Class thực hiện khi dùng sự phản chiếu của Java chuẩn. JavaClass xác định các phương thức để nhận được thông tin trường và phương thức cho lớp này, cũng như thông tin theo cấu trúc về siêu lớp và các giao diện. Không giống như java.lang.Class, JavaClass cũng cung cấp quyền truy cập tới các thông tin nội bộ cho lớp đó, gồm nhóm hằng số và các thuộc tính và biểu diễn lớp nhị phân đầy đủ như một luồng byte. Các cá thể JavaClass thường được tạo bằng cách phân tích cú pháp lớp nhị phân hiện có. BCEL cung cấp lớp org.apache.bcel.Repositoryđể thực hiện phân tích cú pháp cho bạn. Theo mặc định, BCEL phân tích cú pháp và lưu trữ nhanh các biểu diễn của các lớp được tìm thấy trong đường dẫn lớp (classpath) JVM, nhận được các biểu diễn lớp nhị phân thực sự từ một cá thể org.apache.bcel.util.Repository (lưu ý sự khác biệt trong tên gói). Hiện tại org.apache.bcel.util.Repository là một giao diện cho một nguồn biểu diễn lớp nhị phân. Bạn có thể thay thế các đ ường dẫn khác để tìm kiếm các tệp lớp hoặc các cách truy cập thông tin lớp khác, thay cho nguồn mặc định có sử dụng đường dẫn lớp. Thay đổi các lớp Bên cạnh việc truy cập kiểu-phản chiếu tới các thành phần lớp, org.apache.bcel.classfile.JavaClass cũng cung cấp các phương thức để thay đổi lớp đó. Bạn có thể sử dụng những phương thức này để thiết lập bất kỳ các thành phần lớp này với các giá trị mới. Mặc dù, chúng thường không sử dụng trực tiếp, vì các lớp khác trong gói đó không hỗ trợ cho việc xây dựng các phi ên bản mới của các thành phần theo bất kỳ cách hợp lý nào. Thay vào đó, có một tập riêng biệt đầy đủ các lớp trong gói org.apache.bcel.generic để cung cấp phiên bản có thể chỉnh sửa được của các thành phần được các lớp org.apache.bcel.classfile biểu diễn. Cũng như org.apache.bcel.classfile.JavaClass là điểm khởi đầu cho việc sử dụng BCEL để kiểm tra các lớp hiện có, org.apache.bcel.generic.ClassGen là điểm bắt đầu của bạn để tạo các lớp mới. Nó cũng thay đổi các lớp hiện tại -- để xử lý trường hợp đó, có một hàm tạo lấy một cá thể JavaClass và sử dụng nó để khởi tạo thông tin lớp ClassGen. Một khi bạn đã hoàn tất các thay đổi lớp của bạn, bạn có thể nhận được một sự biểu diễn lớp thích hợp từ cá thể ClassGen bằng cách gọi một phương thức trả về một JavaClass, n ...
Tìm kiếm theo từ khóa liên quan:
lập trình java công nghệ java phát triển với java lập mô hình dịch vụ web java ngôn ngữ lập trìnhGợi ý tài liệu liên quan:
-
Giáo trình Lập trình hướng đối tượng: Phần 2
154 trang 271 0 0 -
Bài thuyết trình Ngôn ngữ lập trình: Hệ điều hành Window Mobile
30 trang 261 0 0 -
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 261 0 0 -
Giáo trình Lập trình cơ bản với C++: Phần 1
77 trang 230 0 0 -
Bài giảng Một số hướng nghiên cứu và ứng dụng - Lê Thanh Hương
13 trang 221 0 0 -
Giáo án Tin học lớp 11 (Trọn bộ cả năm)
125 trang 214 1 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 202 0 0 -
Bài tập lập trình Windows dùng C# - Bài thực hành
13 trang 177 0 0 -
Giáo trình Lập trình C căn bản: Phần 1
64 trang 169 0 0 -
Bài giảng Nhập môn về lập trình - Chương 1: Giới thiệu về máy tính và lập trình
30 trang 161 0 0