2016-10-28 13 views
5

Bạn có thể cho tôi biết sự khác biệt giữa Thread.currentThread().getContextClassLoader()TestServlet.class.getClassLoader() là những gì không đánh dấu nó như là trùng lặp và cũng xin giải thích cũng như cung cấp cho tôi ví dụ khi sử dụng cácSự khác nhau giữa Thread.currentThread() classloader và classloader bình thường

Java file:

package com.jar.test; 

public class TestServlet { 
    public static void main(String args[]) {  
     ClassLoader cls = TestServlet.class.getClassLoader().loadClass(
       "com.jar.test.TestServlet"); 
     ClassLoader cls = Thread.currentThread().getContextClassLoader() 
       .loadClass("com.jar.test.TestServlet"); 
    } 
} 
+2

thực sự đó là [trùng lặp] (http://stackoverflow.com/questions/1771679/difference-between-threads-context-class-loader-and-normal-classloader/1772346) – nandsito

+0

"không đánh dấu nó là trùng lặp "nếu bạn biết đây là một bản sao, sau đó rõ ràng [chia sẻ nghiên cứu của bạn] (http://stackoverflow.com/help/how-to-ask). Liên kết đến [duplicate] (http://stackoverflow.com/help/duplicates) và giải thích cách nó khác với câu hỏi của bạn. Trong khi đó, tôi đã gắn cờ đây là một bản sao ... (Btw, cho các lệnh như "không đánh dấu ..." có thể được coi là thô lỗ.) –

Trả lời

4

Thread.currentThread().getContextClassLoader()

Trả về tiếp ext ClassLoader cho số này Thread. Bối cảnh ClassLoader được cung cấp bởi tác giả của chuỗi để sử dụng theo mã chạy trong chuỗi này khi tải các lớp và tài nguyên. Nếu không được đặt, mặc định là ngữ cảnh ClassLoader của Chủ đề gốc. Bối cảnh ClassLoader của chuỗi nguyên thủy thường được đặt thành bộ nạp lớp được sử dụng để tải ứng dụng.

Class#getClassLoader()

Trả lại bộ nạp lớp cho lớp. Một số triển khai có thể sử dụng null để trình bày trình tải lớp khởi động. Phương thức này sẽ trả về null trong các triển khai như vậy nếu lớp này được tải bởi bộ nạp lớp khởi động .


Tóm lại:

Thread.currentThread().getContextClassLoader()ClassLoader của bối cảnh của chủ đề đó đã được thiết lập với setContextClassLoader(ClassLoader cl). Hãy tưởng tượng rằng bạn có một ứng dụng java phức tạp với một hệ thống phân cấp là ClassLoader (ví dụ một Máy chủ ứng dụng) và bạn muốn chuỗi hiện tại của bạn tải các lớp hoặc tài nguyên từ một cấu trúc phân cấp cụ thể là ClassLoader bằng cách đặt bối cảnh ClassLoader các chủ đề này cụ thể ClassLoader.

Class#getClassLoader() chỉ đơn giản là ClassLoader mà từ đó phiên bản Class của bạn đã được tải.

1

Thread.currentThread(). GetContextClassLoader()

Đây là thread hiện hành classloader và không phụ thuộc vào các lớp gọi đó là

TestServlet.class.getClassLoader()

Đây là trình nạp lớp đã tải lớp TestServlet.

xin giải thích cũng như cung cấp cho tôi ví dụ khi sử dụng các

Hãy tưởng tượng bạn đã thread1 thuộc sở hữu của ClassLoader1 và thread2 thuộc sở hữu của ClassLoader2. Có thể bạn tải lớp TestServlet của bạn lên Thread2 (bởi ClassLoader2) và sau đó chuyển nó tới Thread1. Tại thời điểm đó, nếu TestServlet cần tải một Class thuộc sở hữu của ClassLoader1, nó sẽ cần sử dụng Thread.currentThread(). GetCotextClassLoader(), vì nó là ClassLoader riêng là ClassLoader2 và không phải ClassLoader1.

+0

Cảm ơn tất cả, Nếu có thể, vui lòng cung cấp cho tôi một số mã ví dụ để tôi có thể hiểu rõ hơn –

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