Chúng dường như dư thừa trong chức năng mà chúng cung cấp cho chúng tôi. Sự khác biệt chính có vẻ là khi chúng tôi xác định lại một lớp, chúng tôi cung cấp byte[]
với định nghĩa mới ra khỏi màu xanh, trong khi khi chúng tôi retransform, chúng tôi nhận được byte[]
chứa định nghĩa hiện tại qua cùng một API và trả lại một sửa đổi byte[]
.
Do đó, để xác định lại, chúng tôi cần biết thêm về lớp học. Hãy xem xét trường hợp sử dụng của các câu lệnh theo dõi lược tả tiêm. Với retransform bạn có thể làm điều đó trực tiếp hơn: chỉ cần nhìn vào bytecode đã cho, sửa đổi nó và trả về nó. Nhưng nếu chúng tôi đã di chuyển xác định lại tuyến đường, chúng tôi sẽ cần tìm nạp byte[]
gốc từ một nơi nào đó (như getResourceAsStream()
).
Một sự khác biệt rõ ràng là cách chúng ta tương tác với các máy biến áp lớp khác; người đi trước. Các biến đổi được áp dụng cho lớp gốc hoặc một lớp được định nghĩa lại, do đó, một số phép biến đổi có thể là phụ gia, ví dụ.
Về mặt lịch sử, nếu chúng ta nhìn vào Kể từ bình luận trong API documentation, hoặc trên trang 238 của this book (Friesen 2007 Bắt đầu từ Java SE 6 vBulletin), chúng tôi nhận thấy rằng redefinition khả năng đã được giới thiệu trong Java 5, và retransformation trong Java 6. Tôi đoán là retransformation được giới thiệu là một khả năng tổng quát hơn, nhưng định nghĩa lại phải được giữ lại để tương thích ngược.
Trích dẫn câu quan trọng về retransformation phương pháp từ cuốn sách liên kết ở trên:
Đại lý sử dụng các phương pháp để retransform lớp được nạp trước mà không cần phải truy cập vào các file lớp học của họ.
Phần thứ hai của câu hỏi:
Nếu định nghĩa lại xảy ra trước khi đến lớp được nạp và retransformation sau, sau đó khi thực hiện chính xác retransformation xảy ra?
Không, xác định lại xảy ra sau khi lớp được tải, cũng như truyền lại. Chúng xảy ra khi bạn gọi các phương thức và retransformClasses(..)
của trường hợp tương ứng.
Dưới đây là một câu hỏi đối với bất kỳ chuyên gia đi ngang qua: là có bất cứ điều gì bạn có thể làm bằng cách xác định lại lớp học, rằng bạn không thể làm bởi retransforming họ? Tôi đoán là câu trả lời là "không có gì".