2013-09-25 16 views
9

Khi đóng gói một file jar với đại lý tùy chỉnh java, bạn có thể thêm các thuộc tính sau:Sự khác nhau giữa Định nghĩa lại và retransform trong javaagent

  • Can-Redefine-Classes
  • Can-Retransform-Classes

sự khác biệt giữa những người là gì hai?

Nếu xác định lại xảy ra trước khi lớp được tải và truyền lại sau đó, thì khi nào chính xác lại thông tin xảy ra?

Trả lời

4

Định nghĩa lại có nghĩa là tại một thời điểm tùy ý, một tác nhân sẽ gọi Thiết bị đo đạc. redefineClasses để thay đổi định nghĩa thực tế của các lớp hiện có (và đã được nạp). Tác nhân sẽ cung cấp bytecode cho định nghĩa mới.

Biến đổi liên quan đến quá trình chuyển đổi tệp lớp thường được áp dụng ở thời gian tải lớp. Các đại lý có thể đăng ký ClassFileTransformers được gọi là cái khác để áp dụng các biến đổi cho mã byte trước khi lớp được khởi tạo. Vì vậy, Retransformation đề cập đến khả năng của JVM để lặp lại quá trình này cho các lớp đã được nạp. Trong trường hợp này, một tác nhân có thể gọi Instrumentation.retransformClasses chỉ định các lớp nào để truyền lại nhưng không có bytecode. Thay vào đó, JVM sẽ gọi tất cả các ClassFileTransformers có khả năng retransforming đã đăng ký cung cấp bytecode thực tế (hoặc kết quả của biến áp trước đó cho một biến áp bị xích).

3

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ì".

Các vấn đề liên quan