2017-10-31 12 views
6

Trong JLS Sec 8.4.3.6, synchronized methods, nó nói:Tại sao Class.forName ("BumpTest"), không phải là BumpTest.class?

class BumpTest { 
    // ... 
    static synchronized void classBump() { 
     classCount++; 
    } 
} 

có chính xác tác dụng tương tự như:

class BumpTest { 
    // ... 
    static void classBump() { 
     try { 
      synchronized (Class.forName("BumpTest")) { 
       classCount++; 
      } 
     } catch (ClassNotFoundException e) {} 
    } 
} 

này trông lạ với tôi, chưa kể đến quá phức tạp: tại sao sử dụng Class.forName("BumpTest"), không phải BumpTest.class? Không thể là BumpTest không được tải vì nó thực thi mã từ lớp đó. Và viết nó như nó được, kiểm tra ClassNotFoundException đã bị bắt và nuốt.

Có lý do cụ thể nào để viết theo cách này không?

+0

Có thể ví dụ trước các ký tự lớp. Tôi không chắc khi nào lớp học được giới thiệu. – user2357112

+0

Về cơ bản, bạn đang nói rằng nếu bạn chỉ sử dụng với 'BumpTest.class' thay vì' Class.forName'? Bạn đã thử chưa? Có thể ví dụ của họ không phải là ví dụ tốt nhất – sfat

+0

@ user2357112 bạn có thể đúng: ví dụ này nằm trong [thông số Java 1.0] (http://titanium.cs.berkeley.edu/doc/java-langspec-1.0/8.doc .html # 55408), nhưng không có đề cập đến các lớp học. Nếu bạn thêm câu trả lời đó, tôi sẽ chấp nhận. –

Trả lời

3

Nó dường như chỉ là một ví dụ thực sự, cũ kỹ, cũ hơn chữ lớp. Ví dụ tương tự xuất hiện trong các JLS 1.0, trước khi lớp học chữ được giới thiệu.

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