Danh mục

Động lực học lập trình Java, Phần 6: Các thay đổi hướng-khía cạnh với Javassist

Số trang: 22      Loại file: pdf      Dung lượng: 205.87 KB      Lượt xem: 6      Lượt tải: 0    
Thư viện của tui

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

Thông tin tài liệu:

Sử dụng Javassist cho các phép chuyển đổi tìm kiếm-và-thay thế bytecode Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc. Tóm tắt: Nhà tư vấn Java Dennis Sosnoski dành những điều tốt nhất cho phần cuối trong ba phần trình bày của ông về khung công tác Javassist. Lúc này ông cho thấy cách hỗ trợ tìm kiếm-và-thay thế Javassist khiến cho việc chỉnh sửa Java bytecode trên thực tế dễ dàng như một lệnh Thay thế Tất cả (Replace All) của trình soạn thảo văn bản. Bạn có muốn nộp báo cáo tất cả được viết vào một...
Nội dung trích xuất từ tài liệu:
Động lực học lập trình Java, Phần 6: Các thay đổi hướng-khía cạnh với Javassist Động lực học lập trình Java, Phần 6: Các thay đổi hướng-khía cạnh với JavassistSử dụng Javassist cho các phép chuyển đổi tìm kiếm-và-thay thế bytecodeDennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc.Tóm tắt: Nhà tư vấn Java Dennis Sosnoski dành những điều tốt nhất cho phầncuối trong ba phần trình bày của ông về khung công tác Javassist. Lúc này ông chothấy cách hỗ trợ tìm kiếm-và-thay thế Javassist khiến cho việc chỉnh sửa Javabytecode trên thực tế dễ dàng như một lệnh Thay thế Tất cả (Replace All) củatrình soạn thảo văn bản. Bạn có muốn nộp báo cáo tất cả được viết vào một trườngcụ thể hoặc nối một sự thay đổi cho một tham số được chuyển vào một cuộc gọiphương thức không? Javassist thực hiện nó rất dễ dàng và Dennis sẽ cho bạn cáchlàm.Phần 4 và Phần 5 của loạt bài này trình bày cách bạn có thể sử dụng Javassist đểđặt các thay đổi tới các lớp nhị phân. Lúc này bạn sẽ tìm hiểu về một cách sử dụngkhung công tác còn mạnh hơn, tận dụng sự trợ giúp của Javassist để tìm tất cả cáclợi ích của một phương thức hoặc trường cụ thể trong mã byte (bytecode). Tínhnăng này chí ít cũng quan trọng cho sức mạnh của Javassist như sự hỗ trợ của nócho một hướng đi giống như mã nguồn của bytecode cụ thể. Sự hỗ trợ cho việcthay thế có chọn lọc các hoạt động cũng là tính năng làm cho Javassist trở thànhmột công cụ xuất sắc để bổ sung thêm các tính năng lập trình hướng-khía cạnh chomã Java chuẩn.Trong Phần 5 bạn đã thấy cách Javassist cho phép bạn chặn quá trình nạp lớp(classloading) -- và thậm chí thực hiện các thay đổi cho các biểu diễn lớp nhị phânkhi chúng đang được nạp. Các phép biến đổi bytecode có hệ thống mà tôi đangtrình bày trong bài viết này có thể được sử dụng hoặc cho các phép biến đổi tệplớp tĩnh hoặc chặn trong thời gian chạy, nhưng chúng đặc biệt có ích khi được sửdụng trong thời gian chạy.Xử lý các thay đổi bytecodeJavassist cung cấp hai cách riêng biệt để xử lý các thay đổi bytecode có hệ thống.Kỹ thuật đầu tiên, sử dụng lớp javassist.CodeConverter, là một cách sử dụng đơngiản hơn một chút nhưng có nhiều hạn chế về mặt bạn có thể thực hiện cái gì. Kỹthuật thứ hai sử dụng các lớp con tùy chỉnh của lớp javassist.ExprEditor. Kỹ thuậtnày có nhiều việc hơn một chút, nhưng tính linh hoạt được bổ sung nhiều hơn bùđắp cho sự cố gắng đó. Tôi sẽ xem xét các ví dụ về cả hai cách tiếp cận trong b àiviết này.Chuyển đổi mãKỹ thuật Javassist đầu tiên để thay đổi bytecode có hệ thống sử dụng lớpjavassist.CodeConverter. Để sử dụng tốt kỹ thuật này, bạn chỉ cần tạo một cá thểcủa lớp CodeConverter và cấu hình nó với một hoặc nhiều hoạt động chuyển đổi.Mỗi phép chuyển đổi được cấu hình bằng cách sử dụng một cuộc gọi phương thứcnhận biết kiểu chuyển đổi. Các phép chuyển đổi này rơi vào ba loại: các phépchuyển đổi gọi phương thức, các phép chuyển đổi truy cập trường và một phépchuyển đổi đối tượng mới.Đừ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 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 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)Liệt kê 1 cho một ví dụ về cách sử dụng một phép chuyển đổi phương thức gọi.Trong trường hợp này, phép chuyển đổi chỉ cần thêm một khai báo rằng phươngthức này đang được gọi. Trong đoạn mã này, đầu tiên tôi nhận được cá thểjavassist.ClassPool mà tôi sắp sử dụng trong suốt bài này, cấu hình nó để làm việcvới một trình dịch (như đã có trước đây trong Phần 5). Sau đó, tôi truy cập mộtcặp các định nghĩa phương thức thông qua ClassPool. Định nghĩa phương thứcđầu tiên dành cho phương thức kiểu set (thiết lập) để được theo dõi (với tên lớpvà phương thức từ các đối số dòng lệnh), định nghĩa thứ hai cho phương thứcreportSet() trong lớp TranslateConvert, lớp này sẽ thông báo một cuộc gọi chophương thức đầu tiên.Một khi đã có thông tin về phương thức, tôi có thể sử dụng CodeConverterinsertBeforeMethod() để cấu hình một phép chuyển đổi để thêm một cuộc gọi đếnphương thức thông báo trước mỗi cuộc gọi đến phương thức set. Sau đó tất cảnhững thứ cần được thực hiện là áp dụng các bộ chuyển đổi (converter) này chomột hoặc nhiều lớp. Trong đoạn mã của Liệt kê 1, tôi thực hiện việc này trongphương thức onWrite() của lớp bên trong ConverterTranslator với cuộc gọi đếnphương thức instrument() của đối tượng lớp. Việc này sẽ tự động áp dụng phépchuyển đổi này cho mọi lớp đã nạp từ cá thể ClassPool.Liệt kê 1. Sử dụng CodeConverterpublic class TranslateConvert{ public static void main(String[] args) { if (args.length >= 3) { try { // set up class loader with translator ConverterTranslator xlat = ...

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