2015-09-28 15 views
6

Như tôi biết, mỗi lớp có một đối tượng Class. Có một trường hợp khi tôi sử dụng đồng bộ hóa, ví dụ:Đối tượng Class có được tạo khi JVM tải lớp A hay khi tôi gọi A.class?

public class A { 
    public static void main(String... args){ 
     synchronize(A.class){ 
      //do something... 
     } 
    } 
} 

này sẽ khóa A 's Class đối tượng, đúng không? Khi nào đối tượng Class này được tạo? Nó được tạo khi JVM tải lớp A hoặc khi tôi gọi A.class? Tôi không thể tìm thấy chi tiết trong JLS, có thể ai đó vui lòng cung cấp liên kết về nó không?

Trả lời

7

điều này sẽ khóa đối tượng Lớp A, phải không?

có.

câu hỏi của tôi là khi đối tượng Lớp này được tạo? là nó được tạo ra tại tải JVM Một lớp hoặc khi tôi gọi A.class?

Khi Trình nạp lớp tải nó, nó trả về đối tượng Class.

tôi không thể tìm thấy chi tiết trong JLS, có thể ai đó vui lòng cung cấp liên kết về nó, cảm ơn.

tôi khuyên bạn nên đọc các javadoc cho ClassLoader.loadClass()

+0

Xin chào, Peter, cũng có cùng câu hỏi, có thể không? – Tony

+1

@Tony một lớp học có thể được GC chỉ khi trình tải lớp của nó là GC'ed. Điều này có nghĩa là tất cả các phiên bản của tất cả các lớp cho trình nạp lớp không còn được tham chiếu mạnh mẽ nữa. ClassLoader chính/mặc định không bao giờ được GC'ed. –

+0

cảm ơn, A a = new A(), tôi có thể nói a là một thể hiện của lớp A, nhưng đối tượng Lớp A là trường hợp của ai đó, nếu nó thuộc về A, tôi không nghĩ rằng đối tượng Lớp = – Tony

1

Nó được tạo ra khi các lớp được nạp bởi JVM là Javadocs trạng thái:

Class không có constructor nào. Thay vào đó, các đối tượng Class được xây dựng tự động bởi Máy ảo Java vì các lớp được nạp và các cuộc gọi đến phương thức defineClass trong trình nạp lớp.

+0

mỗi lớp chỉ có một thể hiện đối tượng Lớp, phải không? nó có thể không? – Tony

+0

Chỉ có một trường hợp. [Nó có thể được GC'd trong trường hợp cực đoan] (http://stackoverflow.com/questions/2433261/when-and-how-are-classes-garbage-collected-in-java). – manouti

2

Một lớp được khởi tạo bởi một ClassLoader khi lớp được sử dụng đầu tiên, JLS 5.3:

5.3. Creation and Loading

Tạo một lớp hoặc giao diện C biểu thị bằng tên N bao gồm việc xây dựng trong khu vực phương pháp của Máy ảo Java (§2.4) của một biểu diễn bên trong cụ thể của việc thực hiện C. Tạo lớp hoặc giao diện được kích hoạt bởi một lớp hoặc giao diện D khác, tham chiếu đến C thông qua hồ bơi không đổi thời gian chạy của nó. Tạo lớp hoặc giao diện cũng có thể được kích hoạt bằng cách gọi phương thức trong một số thư viện lớp nền tảng Java SE nhất định (§2.12) chẳng hạn như phản ánh.

0

là nó tạo ra khi JVM tải Một lớp

Yes.

hoặc khi tôi gọi A.class?

No. JVM tải A khi một lớp sử dụng nó được tải, ngoài trường hợp phản ánh đặc biệt, không áp dụng ở đây.

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