Động lực học lập trình Java, Phần 5: Việc chuyển đổi các lớp đang hoạt động
Số trang: 20
Loại file: pdf
Dung lượng: 204.99 KB
Lượt xem: 7
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Tìm hiểu cách thay đổi các lớp khi chúng đang được nạp bằng Javassist Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc. Tóm tắt: Sau thời gian gián đoạn ngắn, Dennis Sosnoski trở lại với phần 5 của loạt bài Động lực học lập trình Java của mình. Bạn đã thấy cách viết một chương trình chuyển đổi các tệp lớp Java để thay đổi hành vi mã. Trong bài báo này, Dennis cho bạn thấy cách kết hợp chuyển đổi với việc nạp các lớp thực sự bằng cách sử dụng khung công tác Javassist, để xử lý...
Nội dung trích xuất từ tài liệu:
Động lực học lập trình Java, Phần 5: Việc chuyển đổi các lớp đang hoạt động Động lực học lập trình Java, Phần 5: Việc chuyển đổi các lớp đang hoạt độngTìm hiểu cách thay đổi các lớp khi chúng đang được nạp bằng JavassistDennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc.Tóm tắt: Sau thời gian gián đoạn ngắn, Dennis Sosnoski trở lại với phần 5 củaloạt bài Động lực học lập trình Java của mình. Bạn đã thấy cách viết một chươngtrình chuyển đổi các tệp lớp Java để thay đổi hành vi mã. Trong bài báo này,Dennis cho bạn thấy cách kết hợp chuyển đổi với việc nạp các lớp thực sự bằngcách sử dụng khung công tác Javassist, để xử lý tính năng hướng khía cạnh đúngthời gian linh hoạt. Cách tiếp cận này cho phép bạn quyết định những gì bạnmuốn thay đổi trong thời gian chạy và có khả năng thực hiện các thay đổi khácnhau mỗi khi bạn chạy một chương trình. Theo cách này, bạn cũng sẽ xem xét sâuhơn vào các vấn đề chung của việc nạp lớp (classloading) trong JVM.Trong Phần 4, Các phép biến đổi lớp bằng Javassist, bạn đã học được cách sửdụng khung công tác Javassist để chuyển đổi các tệp lớp Java do tr ình biên dịchtạo ra, viết lại các tệp lớp đã sửa đổi. Bước chuyển đổi tệp lớp này rất quan trọngđể thực hiện các thay đổi liên tục, nhưng không nhất thiết phải tiện lợi khi bạnmuốn thực hiện các thay đổi khác nhau mỗi khi bạn thực hiện ứng dụng của bạn.Đối với các thay đổi thoáng qua như vậy, một cách tiếp cận hoạt động khi bạnthực sự khởi động ứng dụng của bạn là tốt hơn.Kiến trúc JVM cho chúng ta làm điều này thuận tiện -- bằng cách làm việc vớiviệc thực hiện trình nạp lớp (classloader). Khi sử dụng các dấu móc của trình nạplớp, bạn có thể ngăn chặn quá trình nạp các lớp vào JVM và chuyển đổi các biểudiễn lớp trước khi chúng thực sự được nạp. Để minh họa cách làm việc này, đầutiên tôi sẽ giải thích việc chặn nạp lớp trực tiếp, sau đó chỉ ra cách Javassist cungcấp một phím tắt thuận tiện để bạn có thể sử dụng trong các ứng dụng của bạn.Theo cách này, tôi sẽ sử dụng các đoạn mã từ các bài viết trước trong loạt bài này.Đừ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 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)Vùng nạpBình thường, bạn chạy một ứng dụng Java bằng cách xác định lớp chính nh ư làmột tham số cho JVM. Điều này làm việc tốt với các hoạt động tiêu chuẩn, nhưngkhông cung cấp cách nối bất kỳ đúng lúc vào quá trình nạp lớp có ích cho hầu hếtcác ứng dụng. Như tôi đã thảo luận trong Phần 1 Các lớp và việc nạp lớp, nhiềulớp được nạp ngay trước khi lớp chính của bạn bắt đầu thực hiện. Việc ngăn chặnnạp các lớp này đòi hỏi một mức gián tiếp trong việc thực hiện chương trình.May mắn thay, rất dễ dàng để sao chép công việc JVM đã thực hiện trong khi chạylớp chính của ứng dụng của bạn. Tất cả những thứ mà bạn cần làm là sử dụng sựphản chiếu (như đã trình bày trong Phần 2) để trước tiên tìm phương thức tĩnhmain() trong lớp cụ thể, sau đó gọi nó bằng các đối số dòng lệnh mong muốn. Liệtkê 1 đưa ra mã ví dụ để thực hiện điều này (tôi đã để ngoài các phương thức nhậpkhẩu và các lỗi ngoại lệ để giữ cho đoạn mã này ngắn gọn):Liệt kê 1. Trình chạy (runner) ứng dụng Javapublic class Run{ public static void main(String[] args) { if (args.length >= 1) { try { // load the target class to be run Class clas = Run.class.getClassLoader(). loadClass(args[0]); // invoke main method of target class Class[] ptypes = new Class[] { args.getClass() }; Method main = clas.getDeclaredMethod(main, ptypes); String[] pargs = new String[args.length-1]; System.arraycopy(args, 1, pargs, 0, pargs.length); main.invoke(null, new Object[] { pargs }); } catch ... } } else { System.out.println (Usage: Run main-class args...); } }}Để chạy ứng dụng Java của bạn khi sử dụng lớp này, bạn chỉ cần đặt tên nó làmđích cho lệnh java, tiếp sau nó là lớp chính cho ứng dụng của bạn và bất kỳ đối sốnào mà bạn muốn chuyển tới ứng dụng của bạn. Nói cách khác, nếu lệnh mà bạnsử dụng để khởi chạy ứng dụng Java của bạn thường là:java test.Test arg1 arg2 arg3Thì thay vào đó bạn khởi chạy nó khi sử dụng lớp Run bằng lệnh:java Run test.Test arg1 arg2 arg3Chặn nạp lớpThật đúng với riêng nó, lớp Run nhỏ bé từ Liệt kê 1 rất không thực sự có ích. Đểhoàn thành mục tiêu của tôi về việc chặn quá tr ình nạp lớp chúng ta cần phải tiếnmột bước xa hơn, bằng cách định nghĩa và sử dụng trình ...
Nội dung trích xuất từ tài liệu:
Động lực học lập trình Java, Phần 5: Việc chuyển đổi các lớp đang hoạt động Động lực học lập trình Java, Phần 5: Việc chuyển đổi các lớp đang hoạt độngTìm hiểu cách thay đổi các lớp khi chúng đang được nạp bằng JavassistDennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc.Tóm tắt: Sau thời gian gián đoạn ngắn, Dennis Sosnoski trở lại với phần 5 củaloạt bài Động lực học lập trình Java của mình. Bạn đã thấy cách viết một chươngtrình chuyển đổi các tệp lớp Java để thay đổi hành vi mã. Trong bài báo này,Dennis cho bạn thấy cách kết hợp chuyển đổi với việc nạp các lớp thực sự bằngcách sử dụng khung công tác Javassist, để xử lý tính năng hướng khía cạnh đúngthời gian linh hoạt. Cách tiếp cận này cho phép bạn quyết định những gì bạnmuốn thay đổi trong thời gian chạy và có khả năng thực hiện các thay đổi khácnhau mỗi khi bạn chạy một chương trình. Theo cách này, bạn cũng sẽ xem xét sâuhơn vào các vấn đề chung của việc nạp lớp (classloading) trong JVM.Trong Phần 4, Các phép biến đổi lớp bằng Javassist, bạn đã học được cách sửdụng khung công tác Javassist để chuyển đổi các tệp lớp Java do tr ình biên dịchtạo ra, viết lại các tệp lớp đã sửa đổi. Bước chuyển đổi tệp lớp này rất quan trọngđể thực hiện các thay đổi liên tục, nhưng không nhất thiết phải tiện lợi khi bạnmuốn thực hiện các thay đổi khác nhau mỗi khi bạn thực hiện ứng dụng của bạn.Đối với các thay đổi thoáng qua như vậy, một cách tiếp cận hoạt động khi bạnthực sự khởi động ứng dụng của bạn là tốt hơn.Kiến trúc JVM cho chúng ta làm điều này thuận tiện -- bằng cách làm việc vớiviệc thực hiện trình nạp lớp (classloader). Khi sử dụng các dấu móc của trình nạplớp, bạn có thể ngăn chặn quá trình nạp các lớp vào JVM và chuyển đổi các biểudiễn lớp trước khi chúng thực sự được nạp. Để minh họa cách làm việc này, đầutiên tôi sẽ giải thích việc chặn nạp lớp trực tiếp, sau đó chỉ ra cách Javassist cungcấp một phím tắt thuận tiện để bạn có thể sử dụng trong các ứng dụng của bạn.Theo cách này, tôi sẽ sử dụng các đoạn mã từ các bài viết trước trong loạt bài này.Đừ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 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)Vùng nạpBình thường, bạn chạy một ứng dụng Java bằng cách xác định lớp chính nh ư làmột tham số cho JVM. Điều này làm việc tốt với các hoạt động tiêu chuẩn, nhưngkhông cung cấp cách nối bất kỳ đúng lúc vào quá trình nạp lớp có ích cho hầu hếtcác ứng dụng. Như tôi đã thảo luận trong Phần 1 Các lớp và việc nạp lớp, nhiềulớp được nạp ngay trước khi lớp chính của bạn bắt đầu thực hiện. Việc ngăn chặnnạp các lớp này đòi hỏi một mức gián tiếp trong việc thực hiện chương trình.May mắn thay, rất dễ dàng để sao chép công việc JVM đã thực hiện trong khi chạylớp chính của ứng dụng của bạn. Tất cả những thứ mà bạn cần làm là sử dụng sựphản chiếu (như đã trình bày trong Phần 2) để trước tiên tìm phương thức tĩnhmain() trong lớp cụ thể, sau đó gọi nó bằng các đối số dòng lệnh mong muốn. Liệtkê 1 đưa ra mã ví dụ để thực hiện điều này (tôi đã để ngoài các phương thức nhậpkhẩu và các lỗi ngoại lệ để giữ cho đoạn mã này ngắn gọn):Liệt kê 1. Trình chạy (runner) ứng dụng Javapublic class Run{ public static void main(String[] args) { if (args.length >= 1) { try { // load the target class to be run Class clas = Run.class.getClassLoader(). loadClass(args[0]); // invoke main method of target class Class[] ptypes = new Class[] { args.getClass() }; Method main = clas.getDeclaredMethod(main, ptypes); String[] pargs = new String[args.length-1]; System.arraycopy(args, 1, pargs, 0, pargs.length); main.invoke(null, new Object[] { pargs }); } catch ... } } else { System.out.println (Usage: Run main-class args...); } }}Để chạy ứng dụng Java của bạn khi sử dụng lớp này, bạn chỉ cần đặt tên nó làmđích cho lệnh java, tiếp sau nó là lớp chính cho ứng dụng của bạn và bất kỳ đối sốnào mà bạn muốn chuyển tới ứng dụng của bạn. Nói cách khác, nếu lệnh mà bạnsử dụng để khởi chạy ứng dụng Java của bạn thường là:java test.Test arg1 arg2 arg3Thì thay vào đó bạn khởi chạy nó khi sử dụng lớp Run bằng lệnh:java Run test.Test arg1 arg2 arg3Chặn nạp lớpThật đúng với riêng nó, lớp Run nhỏ bé từ Liệt kê 1 rất không thực sự có ích. Đểhoàn thành mục tiêu của tôi về việc chặn quá tr ình nạp lớp chúng ta cần phải tiếnmột bước xa hơn, bằng cách định nghĩa và sử dụng trình ...
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 273 0 0 -
Bài thuyết trình Ngôn ngữ lập trình: Hệ điều hành Window Mobile
30 trang 264 0 0 -
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 264 0 0 -
Giáo trình Lập trình cơ bản với C++: Phần 1
77 trang 232 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 223 0 0 -
Giáo án Tin học lớp 11 (Trọn bộ cả năm)
125 trang 215 1 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 205 0 0 -
Bài tập lập trình Windows dùng C# - Bài thực hành
13 trang 180 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 164 0 0