Danh mục

Động lực học lập trình Java, Phần 4: Chuyển đổi lớp bằng Javassist

Số trang: 17      Loại file: pdf      Dung lượng: 203.28 KB      Lượt xem: 9      Lượt tải: 0    
tailieu_vip

Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Sử dụng Javassist để chuyển đổi các phương thức theo bytecode Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc. Tóm tắt: Thật buồn tẻ với các lớp Java chỉ thực hiện theo cách mã nguồn đã được viết phải không? Sau đó, hãy vui vẻ lên, bởi vì bạn sắp sửa thấy việc kết hợp các lớp theo các hình dạng chưa bao giờ được trình biên dịch dự kiến! Trong bài viết này, nhà tư vấn Java Dennis Sosnoski đóng góp loại bài động lực học lập trình Java của mình vào việc tăng nhanh tốc độ xem...
Nội dung trích xuất từ tài liệu:
Động lực học lập trình Java, Phần 4: Chuyển đổi lớp bằng Javassist Động lực học lập trình Java, Phần 4: Chuyển đổi lớp bằng JavassistSử dụng Javassist để chuyển đổi các phương thức theo bytecodeDennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc.Tóm tắt: Thật buồn tẻ với các lớp Java chỉ thực hiện theo cách mã nguồn đã đượcviết phải không? Sau đó, hãy vui vẻ lên, bởi vì bạn sắp sửa thấy việc kết hợp cáclớp theo các hình dạng chưa bao giờ được trình biên dịch dự kiến! Trong bài viếtnày, nhà tư vấn Java Dennis Sosnoski đóng góp loại bài động lực học lập trìnhJava của mình vào việc tăng nhanh tốc độ xem xét Javassist, thư viện thao tác mãbyte (bytecode), đây là cơ sở cho các tính năng lập trình hướng-khía cạnh được bổsung cho máy chủ ứng dụng JBoss được sử dụng rộng rãi. Bạn sẽ tìm ra nhữngđiều cơ bản về việc chuyển đổi các lớp hiện có với Javassist và nhận thấy cả sứcmạnh lẫn hạn chế của cách tiếp cận mã nguồn mở của khung công tác này với hoạtđộng lớp (classworking).Sau khi trình bày những điều căn bản của việc định dạng lớp Java và truy cậptrong lúc chạy qua phản chiếu, đây là lúc để di chuyển loạt bài này theo hướng tớinhiều chủ đề cao cấp hơn. Trong số tháng này tôi sẽ bắt đầu vào phần thứ hai củaloạt bài, ở đây các thông tin về lớp Java chỉ trở thành một dạng cấu trúc dữ liệukhác được các ứng dụng xử lí. Tôi sẽ gọi toàn bộ lĩnh vực của chủ đề này là hoạtđộng lớp (classworking).Tôi sẽ bắt đầu trình bày hoạt động lớp với thư viện thao tác bytecode Javassist.Javassist không phải là thư viện duy nhất để làm việc với bytecode, mà nó còn cómột tính năng cụ thể làm cho nó trở thành một điểm khởi đầu quan trọng cho cácthí nghiệm hoạt động lớp: bạn có thể sử dụng Javassist để làm thay đổi bytecodecủa một lớp Java mà trên thực tế không cần tìm hiểu bất cứ điều gì về kiến trúcbytecode hoặc kiến trúc máy ảo Java (JVM). Đây là một điều may mắn lẫn trongmột số chi tiết cụ thể -- nói chung tôi không tán thành can thiệp vào công nghệ màbạn không hiểu -- nhưng chắc chắn nó làm cho việc thao tác bytecode có khả năngtruy cập nhiều hơn so với các khung công tác mà ở đó bạn làm việc ở mức cáchướng dẫn riêng.Những điều cơ bản về JavassistJavassist cho phép bạn kiểm tra, chỉnh sửa và tạo các lớp Java nhị phân. Khía cạnhkiểm tra chủ yếu lặp lại chính xác những gì có sẵn trực tiếp trong Java thông quaReflection API, nhưng việc có cách khác để truy cập thông tin này là rất có ích khitrên thực tế bạn đang sửa đổi các lớp thay vì chỉ cần thực hiện chúng. Điều này làdo thiết kế JVM không cung cấp cho bạn bất kỳ quyền truy cập n ào vào dữ liệulớp thô sau khi nó được nạp vào JVM. Nếu bạn sắp làm việc với các lớp như là dữliệu, bạn cần phải làm như thế bên ngoài JVM.Đừng bỏ lỡ phần còn lại của loạt bài nàyPhầ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 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 7, Kỹ thuật bytecode với BCEL (04.2004)Phần 8, Thay thế sự phản chiếu bằng việc tạo mã (06.2004)Javassist sử dụng lớp javassist.ClassPool để theo dõi và kiểm soát các lớp bạnđang thao tác. Lớp này làm việc rất giống như một trình nạp lớp (classloader) củaJVM, nhưng có sự khác biệt quan trọng khác hơn việc kết nối các lớp đã nạp đểthực hiện như một phần của ứng dụng của bạn, nhóm lớp giúp cho các lớp đã nạpcó thể sử dụng như là dữ liệu thông qua Javassist API. Bạn có thể sử dụng mộtnhóm lớp mặc định để nạp từ đường dẫn tìm kiếm JVM hoặc xác định một đườngdẫn để tìm kiếm danh sách các đường dẫn riêng của bạn. Bạn thậm chí có thể tảitrực tiếp các lớp nhị phân từ các mảng hoặc luồng byte và tạo các lớp mới từ đầu.Các lớp được nạp trong một nhóm lớp được các cá thể javassist.CtClass đại diện.Như với lớp Java tiêu chuẩn java.lang.Class, CtClass cung cấp các phương thức đểkiểm tra dữ liệu lớp như các trường và các phương thức. Đó chỉ là sự khởi đầu choCtClass, tuy nhiên, cũng định nghĩa các phương thức để thêm vào các trường, cácphương thức và các hàm tạo mới cho lớp đó và để thay đổi tên lớp, siêu lớp và cácgiao diện. Thật kỳ quặc, Javassist không cung cấp bất kỳ cách nào để xóa cáctrường, các phương thức hoặc các hàm tạo từ một lớp.Các trường, các phương thức và các hàm tạo được các cá thể tương ứngjavassist.CtField, javassist.CtMethod và javassist.CtConstructor biểu diễn. Các lớpnày xác định các phương thức để sửa đổi tất cả các khía cạnh của mục được lớp đóđại diện, bao gồm cả phần bytecode thực sự của một phương thức hoặc hàm tạo.Mã nguồn của tất cả bytecodeJavassist cho phép bạn thay thế hoàn toàn phần thân bytecode của một phươngthức hoặc hàm tạo hoặc thêm vào khả năng chọn lọc bytecode ở đầu hoặc cuối củaphần thân hiện có (cùng với một cặp các biến khác cho các hàm tạo). Dù bằngcách nào, các bytecode mới được chuyển qua như là một câu lệnh hay khối mãnguồn g ...

Tài liệu được xem nhiều: