2014-07-23 15 views
5

Gần đây tôi đã xem bản trình bày trực tuyến của JRebel, trong đó họ giải thích sản phẩm của họ là gì, trong một trong các trang trình bày họ đề cập họ không sử dụng bộ tải lớp (xem ảnh chụp màn hình bên dưới).Cách tải động một lớp Java mà không cần sử dụng trình nạp lớp?

Tôi có một số dự án trong đó tôi sử dụng trình nạp lớp để tải động các lớp trong thời gian chạy, ví dụ như cho tiêm phụ thuộc (như trong khuôn khổ Maker Factory mà tôi đã phát triển). Tôi nghĩ cách duy nhất để nạp một lớp trong Java là bằng cách sử dụng trình nạp lớp.

enter image description here

+0

kiểm tra lại báo giá, họ có thể đã viết bản triển khai của riêng họ và được tô bóng trên đó .. "chúng tôi không sử dụng bộ nạp lớp jre" – edthethird

+0

Thực ra tôi đọc ở pdf là một nhân viên của họ (cố gắng thuyết phục tôi sử dụng/mua sản phẩm) gửi cho tôi, nhưng nó cũng có thể được tìm thấy trong: http://www.slideshare.net/boothdavid/how-can-jrebel-save-me-6-weeks-of-builds - và-redeploys-năm nay trong slide số 8, tôi cũng sẽ cố gắng để thêm một ảnh chụp màn hình của pdf Tôi có – raspacorp

Trả lời

3

Disclaimer: Tôi tham gia với sự phát triển JRebel

Về mặt kỹ thuật, người ta có thể bỏ qua các classloader với một số ma thuật không an toàn, và JVM thúc đẩy điều đó với lambdas khi tạo các lớp nặc danh runtime (trong Java 8) .

Tuy nhiên, JRebel thực sự tích hợp với các trình nạp lớp hiện có và không tạo các trình nạp lớp mới - đó là ý nghĩa của trang trình bày. JRebel không loại bỏ trình nạp lớp hiện có khi nó phải tải lại một lớp. Thay vào đó, nó tải và phiên bản các lớp trong các trình nạp lớp hiện có.

+0

do đó, nó sử dụng một bộ nạp lớp? – edthethird

+0

Nó sử dụng các trình nạp lớp hiện có, tất nhiên. Nếu không, làm thế nào một ứng dụng Java thậm chí thực hiện :) –

+0

ha đúng, do đó, câu trả lời cho "Làm thế nào để tự động nạp một lớp Java mà không cần sử dụng một trình nạp lớp?" là "Bạn không thể, nhưng bạn có thể ...". Điều đó thật tuyệt, chỉ muốn làm rõ – edthethird

3

họ đề cập đến họ không sử dụng bộ tải lớp.

Mọi lớp đều sử dụng Trình nạp lớp (ngoại trừ nguyên thủy). Tuy nhiên, một thư viện không phải tạo thêm ClassLoader.

Ngay cả một chương trình "Hello World" sẽ có hai bộ tải lớp (một cho boostrapping)

Tôi nghĩ cách duy nhất để nạp một lớp trong Java là bằng cách sử dụng một bộ nạp lớp.

Đó là, nhưng bạn có thể buộc trình nạp lớp hiện có tải lớp của bạn bị hack nhưng có thể đơn giản hơn để sử dụng.

(Chỉnh sửa) Nếu bạn sử dụng null làm Trình nạp lớp, Unsafe.defineClass() sẽ mặc định cho Trình nạp lớp của người gọi.

0

Bạn có thể tự mình đọc tệp lớp học vào bộ nhớ. Nhưng để làm cho lớp có sẵn trong mã của bạn, bạn vẫn cần phải sử dụng ClassLoader#defineClass.

Nói chung, bất kỳ lớp nào được sử dụng trong chương trình phải được định nghĩa bởi trình tải lớp, nếu không thì cần trả lại getClass().getClassLoader()?

1

Thật vậy, cách duy nhất để tải một lớp là thông qua trình tải lớp.

Nhân viên JRebel có thể muốn nói rằng không sử dụng bộ nạp lớp học để xác định lại các lớp học. Việc xác định lại một lớp học là có thể thông qua các phương tiện khác, ví dụ thông qua JVMTI.

3

Vì vậy, câu trả lời cho câu hỏi này có thể là: Không có cách nào để tự động tải một lớp Java mà không sử dụng một bộ nạp lớp cho lần đầu tiên. Nhưng có thể tải lại một lớp bằng cách thiết lập bộ nạp lớp.

Dựa vào liên kết câu trả lời Dave Newton, giải nén những điều quan trọng từ faq JRebel:

Họ sử dụng Instrumentation API để cụ các/Server bộ tải lớp container, cách mà họ có thể tự động theo dõi và kiểm soát các quá trình tải. Họ sẽ quét đường dẫn lớp để tìm kiếm tệp .class tương ứng với lớp đã tải và sử dụng dấu thời gian tệp để phát hiện các thay đổi trên đó.Khi một thay đổi được phát hiện, chúng sẽ truyền bá sự thay đổi đó thông qua bộ nạp lớp được thiết lập. Nó sẽ bảo toàn các cá thể hiện có của lớp nhưng sẽ không chạy lại hàm khởi tạo, điều đó có nghĩa là các trường mới được thêm vào sẽ không được khởi tạo.

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