2011-09-13 28 views
5

Chúng tôi có bộ nhớ cache (Map) với các đối tượng của Class TestClass. classloader khác khởi/tải TestClass khi chạy một lần nữa, vì vậy bên dưới mã sẽ ném một ClassCastException:Loại A không bằng loại A

TestClass obj1 = (TestClass)map.get("key"); // throws a ClassCastException 

ClassCastException when casting to the same class

Được rồi, tôi hiểu vấn đề này đến thời điểm này.

Vì vậy, tôi đã cố gắng tìm thông tin cơ bản tại sao là TestClass.class không bằng TestClass.class. Tôi giả định rằng trình nạp lớp khác nhau đặt một id khác cho ReferenceType? Bất cứ ai có thể giải thích nền cho tôi?

trang xuất sắc nhất tôi đã tìm thấy: http://www.objectsource.com/j2eechapters/Ch21-ClassLoaders_and_J2EE.htm

Trả lời

8

Vâng, điểm nghiên cứu của bạn để đi đúng hướng: định nghĩa lớp cùng nạp bởi bộ tải lớp khác nhau được coi là hai lớp riêng biệt bởi JVM. Vì vậy, đúc giữa chúng không thành công với ClassCastException.

Tôi nghĩ sự khác biệt chỉ đơn giản là vì có hai đối tượng mã thông báo lớp khác nhau đang phát. Nó phải như thế này, vì các lớp được nạp bởi các trình tải khác nhau có thể thực tế là các phiên bản khác nhau của cùng một lớp. Nó được biết rằng lớp mã thông báo cho mỗi lớp là duy nhất (trong cùng một lĩnh vực bộ nạp lớp, có nghĩa là). Nó sẽ mở ra một hộp giun nếu JVM bắt đầu so sánh các mã thông báo lớp theo các thuộc tính khác nhau của chúng, chứ không phải bằng phương trình vật lý (==).

1

Điều bạn đã trải nghiệm là lý do tại sao trình tải lớp tùy chỉnh tồn tại. Chúng cho phép tải lớp khác nhau có cùng tên trong một JVM. Danh tính của một lớp trong một JVM được đưa ra bởi bộ tuple bao gồm tên lớp và trình nạp lớp. Trong ngôn ngữ Java, một lớp được xác định chỉ bằng tên đầy đủ.

1

Bất kỳ ai cũng có thể giải thích lý lịch cho tôi?

Vì Péter Török đã giải thích rằng chúng được coi là khác nhau khi được tải từ các trình nạp lớp khác nhau. Nền là máy chủ ứng dụng có thể hỗ trợ các phiên bản khác nhau của một ứng dụng, ví dụ: các phiên bản khác nhau của cùng một thư viện có trong tệp tai của bạn.

1

Không có gì bí ẩn. bình đẳng Runtime các loại được định nghĩa trong ngôn ngữ Java Specification như sau:.

"Vào lúc chạy, một số loại tài liệu tham khảo với tên nhị phân tương tự có thể được nạp đồng thời bởi bộ tải lớp khác nhau Những loại có thể hoặc không có thể đại diện cùng một kiểu khai báo. Ngay cả khi hai kiểu như vậy đại diện cho cùng một kiểu khai báo, chúng được coi là khác biệt. "

JLS 4.3.4 - When reference types are the same. (Đoạn 2)

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