2015-02-02 14 views
6

Tôi muốn hiểu cách trình nạp lớp Java hoạt động. Tôi đã đọc một số bài báo, nhưng có một số điều vẫn chưa rõ ràng với tôi.Tải lớp Java

Theo như tôi hiểu bộ nạp lớp đầu tiên là bộ nạp lớp Bootstrap (BCL). Sản phẩm có được JVM nạp không?

Sau đó, BCL tải thư viện rt.jar và Trình nạp lớp mở rộng (ECL).

Lần lượt, ECL tải các tiện ích mở rộng và Trình tải lớp ứng dụng (ACL). ACL chịu trách nhiệm nạp tất cả các lớp do người dùng phát triển từ classpath.

Mô tả này có chính xác không?

Có một số câu hỏi:

  1. Có chỉ có một thể hiện của mỗi classloader tồn tại trong ký ức? (BCL, ECL, ACL)?
  2. Tôi đã xem xét nguyên tắc ủy quyền nhưng có một chút không rõ ràng đối với tôi. Làm thế nào nó hoạt động, chúng ta hãy giả sử chúng ta cần tải MyClass. Jvm đầu tiên cung cấp tên lớp này cho ACL, và đây là điều không rõ ràng đối với tôi, ACL xem qua đường dẫn lớp và nếu không có đại biểu lớp nào làm việc với cha mẹ HOẶC nó ủy nhiệm công việc này cho cha mẹ ngay sau khi gọi, ý tôi là JVM cung cấp tên lớp cho ACL, nó không tìm kiếm lớp này cung cấp cho ECL, CL này lần lượt cũng không thực hiện bất kỳ công việc nào và đưa nó cho BCL, và chỉ khi BCL không thể tìm thấy lớp này, nó trả về mức thấp hơn mức độ (ECL) .... và như vậy. Chuỗi chính xác là gì?
  3. Khi chúng tôi tạo trình nạp lớp tùy chỉnh lớp cha mẹ là gì? Ứng dụng ClassLoader? Chúng ta có thể chỉ định, ví dụ ECL. Theo phân cấp của bộ nạp lớp không phải là thừa kế, chúng tôi chỉ định cha mẹ trong hàm tạo. Chúng ta có thể lấy dụ của trình nạp lớp ECL để chỉ định nó trong CL tùy chỉnh của chúng ta như là một phụ huynh trong hàm tạo.
  4. Tại sao các lớp như String, Object và vv không trả lại bất kỳ ClassLoadder nào?
+0

liên quan: http://stackoverflow.com/questions/15250656/how-is-the-classloader-for-a-class-chosen?rq=1 –

+0

http://javarevisited.blogspot.co .uk/2012/12/how-classloader-works-in-java.html; –

Trả lời

5

Đáp:

  1. Theo như tôi hiểu được bộ nạp lớp đầu tiên là lớp Bootstrap loader (BCL). Nó được nạp bởi JVM?

    Điều này không được xác định rõ ràng, nhưng rất có thể được viết bằng mã gốc.

  2. Sau đó, BCL tải thư viện rt.jar và Trình nạp lớp mở rộng (ECL).

    Có nó sẽ tải rt.jar (cho đến Java 8 như trong Java 9 sẽ có hệ thống mô-đun mới). Cho dù tải ECL hay không thì không được xác định rõ ràng.

  3. Lần lượt, ECL tải tiện ích mở rộng và Trình tải lớp ứng dụng (ACL). ACL chịu trách nhiệm nạp tất cả các lớp do người dùng phát triển từ classpath.

    Có tải tiện ích mở rộng và liệu tải có được ACL hay không không được xác định rõ ràng. ACL tải các mục classpath, thực sự.

  4. Chỉ có một phiên bản của mỗi trình nạp lớp tồn tại trong bộ nhớ? (BCL, ECL, ACL)?

    Vâng, điều này là chính xác. Vì danh tính lớp được định nghĩa là một cặp FQCN và trình nạp lớp hiệu quả của nó, nếu không nó sẽ không hoạt động.

  5. Tôi đã xem xét nguyên tắc ủy quyền nhưng có một chút không rõ ràng đối với tôi. Làm thế nào nó hoạt động, chúng ta hãy giả sử chúng ta cần tải MyClass. Jvm đầu tiên cung cấp tên lớp này cho ACL, và đây là điều không rõ ràng đối với tôi, ACL xem qua đường dẫn lớp và nếu không có đại biểu lớp nào làm việc với cha mẹ HOẶC nó ủy nhiệm công việc này cho cha mẹ ngay sau khi gọi, ý tôi là JVM cung cấp tên lớp cho ACL, nó không tìm kiếm lớp này cung cấp cho ECL, CL này lần lượt cũng không thực hiện bất kỳ công việc nào và đưa nó cho BCL, và chỉ khi BCL không thể tìm thấy lớp này, nó trả về mức thấp hơn mức độ (ECL) .... và như vậy. Chuỗi chính xác là gì?

    Trong tiêu chuẩn Java, có cha mẹ đầu tiên mô hình đoàn, có nghĩa là classloader đầu tiên sẽ hỏi mẹ của nó và chỉ sau đó sẽ cố gắng tải một lớp bằng cách riêng của mình.

  6. Khi tạo trình nạp lớp tùy chỉnh lớp cha mẹ là gì? Ứng dụng ClassLoader? Chúng ta có thể chỉ định, ví dụ ECL. Theo phân cấp của bộ nạp lớp không phải là thừa kế, chúng tôi chỉ định cha mẹ trong hàm tạo. Chúng ta có thể lấy dụ của trình nạp lớp ECL để chỉ định nó trong CL tùy chỉnh của chúng ta như là một phụ huynh trong hàm tạo.

    Cha mẹ mặc định của trình nạp lớp tùy chỉnh của bạn là trình nạp lớp ứng dụng.

    Câu hỏi đặt ra là tại sao bạn cần phải làm điều đó? Rất có thể chương trình của bạn sẽ hoạt động không chính xác. Chính thức, bạn có thể làm điều này bằng cách YourClass.class.getClassLoader().getParent().

  7. Tại sao các lớp như String, Object và vv không trả lại bất kỳ Trình nạp lớp nào?

    Trình nạp lớp khởi động được biểu diễn là null trong API.