2011-12-09 12 views
8

Xin chào các bạn: Tôi đang cố gắng gỡ lỗi một lỗi lớp rất lạ bằng cách xem các số ClassLoader cho một số thành phần được tạo động. ClassLoader s là thứ mà tôi chưa bao giờ chơi nhiều với - và tôi ngạc nhiên khi các lớp JDK tiêu chuẩn có null phiên bản trình nạp lớp.Các lớp JDK cổ phiếu và Trình nạp lớp "không"?

ai đó có thể giải thích kết quả của phương pháp chính đơn giản này về các lớp học mà bộ tải Tôi đang cố gắng để in, và cũng có thể tổng quát hơn -

  1. đường ClassLoader s làm việc trên JVM và
  2. cách chúng tôi có thể gỡ lỗi các lớp bị thiếu bằng cách sử dụng ClassLoader s.
public class MyClass { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     System.out.println(relfect.MyClass.class.getClassLoader()); 
     System.out.println(String.class.getClassLoader()); 
     System.out.println(ArrayList.class.getClassLoader()); 
     System.out.println(JButton.class.getClassLoader()); 
     System.out.println(System.class.getClassLoader()); 

     Boolean b = new Boolean(true); 
     System.out.println(b.getClass().getClassLoader()); 

    } 

} 

Output

sun.misc.Lau[email protected] 
null 
null 
null 
null 
null 
+0

Câu hỏi này có vẻ ngoài chủ đề vì StackOverflow không thay thế cho tài liệu JDK tầm thường. –

Trả lời

18

Các javadoc cho getClassLoader() nói

Trả lại bộ nạp lớp cho lớp. Một số triển khai có thể sử dụng null để biểu diễn trình nạp lớp bootstrap. 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 nạp bởi trình nạp lớp bootstrap.

Vì vậy, ít nhất hãy giải thích lý do bạn nhận được kết quả đó. Nhưng nó không giải thích tại sao những người triển khai quyết định làm theo cách đó.

EDIT: Sau khi thử nghiệm thêm các lớp của riêng tôi vào lớp bootclasspath thì chúng cũng hiển thị dưới dạng trình nạp lớp rỗng.

+0

Xin cảm ơn, tôi đang trong quá trình chỉnh sửa câu hỏi khi bạn trả lời để làm rõ các câu hỏi chung chung hơn mà tôi có. Nhưng trong mọi trường hợp, câu trả lời của bạn là hữu ích. – jayunit100

+0

@ jayunit100 Xin lỗi ;-) Nhưng bạn luôn có thể đăng thêm câu hỏi. –

+2

Đây là chức năng cũ. Tôi cho rằng đó là cách này vì "sai lầm đã được thực hiện". Một lý do có thể cho điều này có thể là do trả về null, lớp không cần lưu trữ và/hoặc theo dõi trình nạp lớp; nó chỉ thực hiện getClassLoader là '{return null}' – DwB

2

Trình nạp lớp của các lớp khởi động là null, đây không phải là lớp java.

Đừng nhầm lẫn các lớp được tìm thấy trong đường dẫn lớp và đường dẫn được tải bởi bộ tải khởi động. Cái sau chịu trách nhiệm cho các lớp JDK cốt lõi thường được tìm thấy trong rt.jar. Đó là một trình nạp lớp gốc, do đó không có tham chiếu tới.

Các lớp trên đường dẫn lớp được tải bởi Trình nạp lớp hệ thống và lớp của lớp đó có thể được chỉ định thông qua thuộc tính.

Morealso trình nạp lớp rỗng được coi là vấn đề bảo mật và có các kiểm tra dựa trên lớp người gọi có trình nạp lớp rỗng.

0

Đây là cách hoạt động. Bất cứ khi nào JVM cố gắng tải bất kỳ lớp nào, nó sẽ kiểm tra các điều kiện bên dưới.

Nếu lớp được tải từ lớp Bootstrap ClassPath tức là; jdk \ jre \ lib \ rt.jar, BootStrap ClassLoader sẽ được gọi.

Nếu lớp được tải từ Extension Classpath tức là; jdk \ jre \ lib \ ext * .jar, Trình nạp lớp mở rộng sẽ được gọi.

Nếu lớp được tải từ Lớp ứng dụng, nghĩa là; như được chỉ định trong Biến môi trường, Trình nạp lớp ứng dụng được gọi.

Vì Bootstrap ClassLoader không được triển khai trong java, nó được triển khai trong c hoặc C++ nên không có tham chiếu nào cho nó vì sao nó trả về null. Nhưng Extension và Application class Loader được viết bằng java, do đó bạn sẽ nhận được tham chiếu như [email protected][email protected]

Vì vậy, nếu bạn làm một cái gì đó như thế này System.out.println (String.class.getClassLoader()), bạn sẽ nhận được null vì lớp này được gọi bởi BootStrap ClassLoader, Mặt khác nếu bạn làm điều tương tự cho một lớp trong đường dẫn Ext hoặc App Class, bạn sẽ nhận được $ ExtClassLoader @ someHexValue và [email protected] tương ứng.