Thư viện tri thức trực tuyến
Kho tài liệu với 50,000+ tài liệu học thuật
© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Độ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 pdf
Nội dung xem thử
Mô tả chi tiết
Độ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
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ý tính năng hướng khía cạnh "đúng
thờ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ạn
muốn thay đổi trong thời gian chạy và có khả năng thực hiện các thay đổi khác
nhau 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âu
hơ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ịch
tạ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ạn
muố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ạn
thự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ới
việ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ạp
lớ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ểu
diễ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, đầu
tiê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 cung
cấ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à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 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ạp
Bì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ưng
khô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ết
cá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ều
lớ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ặn
nạ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ạy
lớ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ĩnh
main() trong lớp cụ thể, sau đó gọi nó bằng các đối số dòng lệnh mong muốn. Liệt
kê 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ập
khẩ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 Java
public class Run
{
public static void main(String[] args) {
if (args.length >= 1) {
try {
// load the target class to be run