2009-11-19 26 views
6

Hãy tưởng tượng một lớp Java có hầu hết các tính năng mà bạn có thể tìm thấy trong một lớp học. Ví dụ: nó kế thừa từ một lớp khác, thực hiện một vài giao diện, bao gồm một số hằng số 'cuối cùng tĩnh', một số hằng số cuối cùng, một số biến tĩnh, biến mẫu, khối tĩnh, khối mã chưa được đặt tên (chỉ mã trong {}), phương thức, phương thức, vv ..Thứ tự các lớp khác nhau của một lớp được khởi tạo khi một lớp được nạp trong JVM là gì?

Khi lớp học được đề cập được nạp vào JVM lần đầu tiên, theo thứ tự nào các phần khác nhau của lớp được khởi tạo hoặc nạp vào JVM? Ngăn xếp cuộc gọi trong JVM trông như thế nào đối với tải? Giả sử rằng chỉ có một trình nạp lớp đang hoạt động ở đây.

Điều này sẽ quay trở lại các khái niệm cơ bản/nội bộ tuyệt đối của Java, nhưng tôi đã không thể tìm thấy một bài viết hay giải thích trình tự chính xác.

Trả lời

1

Làm thế nào về JLS, cụ thể là phần 12.4?

+0

thực sự mượt mà ... :) muốn tôi có cụm từ tìm kiếm google phù hợp để đến JLS! cũng chỉ xảy ra với tôi rằng tôi có thể đã chạy điều này thông qua trình gỡ lỗi nhật thực ... :( – Thimmayya

3

này có thể được mô tả trong phần 2.17.4 of the JVMS 5.0/6

2.17.4 Khởi

Khởi tạo của một lớp gồm:

  • thi initializers nó tĩnh (§2.11) và
  • trình khởi tạo cho các trường tĩnh (§2.9.2) được khai báo trong lớp.

Việc khởi tạo giao diện bao gồm việc thực thi trình khởi tạo cho các trường được khai báo trong giao diện (§2.13.3.1).

Trước khi một lớp hoặc giao diện được khởi tạo, lớp cha trực tiếp của nó phải được khởi tạo, nhưng các giao diện được lớp thực hiện không cần phải được khởi tạo. Tương tự, các siêu kết nối của một giao diện không cần phải được khởi tạo trước khi giao diện được khởi tạo.

Một lớp học hoặc giao diện kiểu T sẽ được khởi tạo ngay trước khi một trong những điều sau đây xảy ra:

  • T là một lớp và một thể hiện của T được tạo ra.
  • T là một lớp và phương thức tĩnh của T được gọi.
  • Trường tĩnh T không ổn định được sử dụng hoặc gán. Một trường liên tục là một trường (rõ ràng hoặc ngầm) cả cuối cùng và tĩnh, và được khởi tạo với giá trị của một biểu thức hằng số biên dịch. Một tham chiếu đến một trường như vậy phải được giải quyết tại thời gian biên dịch thành một bản sao của giá trị hằng số thời gian biên dịch, vì vậy việc sử dụng một trường như vậy không bao giờ gây ra khởi tạo.

Gọi một số phương thức nhất định trong lớp thư viện (§3.12) cũng khiến khởi tạo lớp hoặc giao diện. Xem các đặc tả thư viện lớp của nền tảng Java 2 (ví dụ, lớp Class và gói java.lang.reflect) để biết chi tiết.

Mục đích ở đây là một loại có bộ khởi tạo đặt nó ở trạng thái nhất quán và trạng thái này là trạng thái đầu tiên được quan sát bởi các lớp khác. Trình khởi tạo tĩnh và khởi tạo biến lớp được thực hiện theo thứ tự văn bản và không thể tham chiếu đến các biến lớp được khai báo trong lớp mà khai báo xuất hiện văn bản sau khi sử dụng, mặc dù các biến lớp này nằm trong phạm vi.Hạn chế này được thiết kế để phát hiện, tại thời gian biên dịch, hầu hết các lần khởi tạo dạng vòng tròn hoặc không đúng định dạng.

Trước khi một lớp hoặc giao diện được khởi tạo siêu lớp của nó được khởi tạo, nếu nó chưa được khởi tạo trước đó.


Phiên bản cập nhật của Initialization in JVMS 8 is in Chapter 5.5

Khởi tạo của một lớp hoặc giao diện bao gồm thực hiện lớp hoặc giao diện phương thức khởi tạo của nó (§2.9).

Một lớp học hoặc giao diện có thể được khởi tạo chỉ như là một kết quả của:

  • Việc thực hiện bất kỳ một trong các hướng dẫn Java Virtual Machine new, getstatic, putstatic, hoặc invokestatic tham chiếu đến lớp hoặc giao diện (§new , §getstatic, §putstatic, §invokestatic).
    Tất cả các hướng dẫn này tham chiếu một lớp trực tiếp hoặc gián tiếp thông qua tham chiếu trường hoặc tham chiếu phương thức.
    Khi thực hiện lệnh mới, lớp hoặc giao diện được tham chiếu được khởi tạo nếu nó chưa được khởi tạo.
    Khi thực hiện lệnh getstatic, putstatic hoặc invokestatic, lớp hoặc giao diện tuyên bố trường hoặc phương thức được giải quyết được khởi tạo nếu nó chưa được khởi tạo.
  • Các gọi đầu tiên của một trường hợp java.lang.invoke.MethodHandle mà là kết quả của độ phân giải của một tay cầm phương pháp của Java Virtual Machine (§5.4.3.5) và trong đó có một loại 2 (REF_getStatic), 4 (REF_putStatic), 6 (REF_invokeStatic), hoặc 8 (REF_newInvokeSpecial).
  • Gọi một số phương pháp phản chiếu nhất định trong thư viện lớp học (§2.12), ví dụ: trong lớp Class hoặc trong gói java.lang.reflect.
  • Khởi tạo một trong các lớp con của nó.
  • Chỉ định của nó là lớp khởi đầu tại Java Virtual Machine start-up (§5.2).

Trước khi khởi tạo, một lớp hoặc giao diện phải được liên kết, được xác minh, chuẩn bị và tùy chọn giải quyết.

Vì máy ảo Java đa luồng, khởi tạo một lớp hoặc giao diện yêu cầu đồng bộ hóa cẩn thận, vì một số chủ đề khác có thể đang cố gắng khởi tạo cùng một lớp hoặc giao diện cùng một lúc.
Cũng có khả năng khởi tạo lớp hoặc giao diện có thể được yêu cầu đệ quy như là một phần của quá trình khởi tạo của lớp hoặc giao diện đó.

Việc triển khai Máy ảo Java chịu trách nhiệm quản lý đồng bộ hóa và khởi tạo đệ quy bằng cách sử dụng quy trình sau.
Nó giả định rằng đối tượng Class đã được xác minh và chuẩn bị, và rằng đối tượng Class chứa trạng thái đó chỉ ra một trong bốn trường hợp:

  • đối tượng Class này được xác minh và chuẩn bị sẵn sàng nhưng không được khởi tạo.
  • Đối tượng Class này đang được khởi tạo bởi một số chuỗi cụ thể.
  • Đối tượng Class này được khởi tạo hoàn toàn và sẵn sàng để sử dụng.
  • Đối tượng Class này ở trạng thái sai, có thể do đã khởi tạo và thất bại.
+0

+1 để cập nhật. – sunleo

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