2015-01-12 13 views
5

Tôi đã viết một lớp java nhỏ mà tôi muốn tải bằng cách sử dụng ClassLoader.Công việc của ClassLoader loadClass()

public class ClassLoadingObj { 

    public ClassLoadingObj(){ 
     System.out.println("---instantiating ClassLoadingObj "); 
    } 

    static{ 
     System.out.println("---Loading ClassLoadingObj"); 
    } 
} 

Nhưng khi tôi thực hiện đoạn mã sau:

ClassLoader.getSystemClassLoader().loadClass("com.st.classLoader.ClassLoadingObj"); 

tôi thấy rằng các khối tĩnh không được thực thi. Câu hỏi của tôi là nếu một lớp được nạp bằng cách sử dụng phương thức loadClass(), tại sao các khối tĩnh không được thực thi so với việc khởi tạo một lớp nơi các khối tĩnh luôn được thực hiện.

Trả lời

0

Có hai loại trình tải lớp trong java. Có lẽ ClassLoader bạn sử dụng là java2angjava.lang.ClassLoader, nhưng hệ thống sẽ không sử dụng ClassLoader này. Bạn có thể thử com.sun.org.apache.bcel.internal.util.ClassLoader.getSystemClassLoader(), nó sẽ thực hiện khối tĩnh. Thông tin chi tiết bạn có thể tham khảo để này trang (http://en.wikipedia.org/wiki/Java_Classloader#Class_Loaders_in_JEE)

3

khối Thật sự tĩnh được thực hiện khi lớp là khởi và đó là một chút khác nhau từ nạp.

Trước khởi lớp là liên kết và trước đó nó là nạp, vì vậy có 3 (hoặc 4, bao gồm không tải) trạng thái của lớp.

Here cũng được mô tả cách hoạt động và các yêu cầu cho lớp học được khởi tạo là gì.

Một đoạn trích:

Java ảo đặc điểm kỹ thuật máy cho triển khai linh hoạt trong thời gian của lớp và giao diện tải và liên kết, nhưng xác định đúng thời điểm khởi tạo. Mọi triển khai phải khởi tạo mỗi lớp hoặc giao diện khi sử dụng hoạt động đầu tiên của nó. Sáu tình huống sau đủ điều kiện sử dụng như tích cực:

  • Một ví dụ mới của một lớp được tạo ra (trong bytecode, việc thực hiện một hướng dẫn mới Ngoài ra, thông qua sự sáng tạo tiềm ẩn, phản ánh, sao chép, hoặc deserialization..)
  • Yêu cầu phương thức tĩnh được khai báo bởi một lớp (trong bytecode, thực thi lệnh không trực tiếp)
  • Việc sử dụng hoặc gán một trường tĩnh được khai báo bởi một lớp hoặc giao diện, ngoại trừ các trường tĩnh là cuối cùng và được khởi tạo theo biểu thức hằng số biên dịch (trong bytecode, thực thi của một getstatic hoặc hướng dẫn putstatic)
  • Các gọi các phương pháp phản xạ nhất định trong API Java, chẳng hạn như các phương pháp trong lớp lớp hoặc trong các lớp trong gói java.lang.reflect
  • Việc khởi của một lớp con của một class (Khởi tạo một lớp đòi hỏi phải khởi tạo trước lớp cha của nó.)
  • Việc chỉ định một lớp như lớp ban đầu (với main() < phương pháp) khi một máy ảo Java khởi động
Các vấn đề liên quan