2017-09-29 15 views

Trả lời

11

Để cung cấp truy cập phản chiếu để mô-đun của bạn, Java 9 giới thiệu mở từ khóa.

Bạn có thể tạo mô-đun mở bằng cách sử dụng mở từ khóa trong khai báo mô-đun.

An mở mô-đun cấp quyền truy cập phản chiếu cho tất cả các gói của nó cho các mô-đun khác. Ví dụ, nếu bạn muốn sử dụng một số khung công tác, phụ thuộc rất nhiều vào sự phản chiếu, chẳng hạn như Spring, Hibernate vv, bạn có thể sử dụng từ khóa này, để cho phép truy cập phản chiếu cho nó.

Bạn có thể cho phép truy cập phản xạ đối với các gói quy định của module của bạn bằng cách sử dụng mở ra tuyên bố trong khai gói:

module foo { 
    opens com.example.bar; 
} 

hoặc sử dụng từ khóa mở trong khai mô-đun:

open module foo { 
} 

nhưng hãy nhớ, bạn không thể kết hợp chúng:

open module foo { 
    opens com.example.bar; 
} 

kết quả bằng com lỗi thời gian.

Hy vọng điều đó sẽ hữu ích.

+1

Theo định nghĩa, các mô-đun mở không mở bất kỳ gói nào, theo mặc định, tất cả các gói được coi là mở trong mô-đun kết quả. :) – nullpointer

5

Một chút nền cho chỉ thị được đề cập. Các Module System tiểu bang ở Breaking đóng gói phần

Đó là đôi khi cần thiết để vi phạm kiểm soát truy cập ranh giới xác định bởi các hệ thống mô-đun, và thực thi bởi trình biên dịch và máy ảo, để để cho phép một mô-đun truy cập một số loại chưa được công bố khác của mô-đun khác. Điều này có thể được mong muốn, ví dụ: bật thử nghiệm hộp màu trắng của các loại nội bộ hoặc để hiển thị các API nội bộ không được hỗ trợ để mã phụ thuộc vào chúng. Có thể sử dụng tùy chọn --add-exports, tại cả thời gian biên dịch và thời gian chạy, để thực hiện việc này.

Các tùy chọn dòng lệnh tương đương với ví dụ: -

module java.logging { 
    exports java.util.logging; 
} 

Tùy chọn --add-exports phép truy cập vào các loại công của một gói nhất định.


Mặc dù sau đó,

Đó là đôi khi cần thiết để đi xa hơn và cho phép truy cập vào tất cả các yếu tố ngoài công lập thông qua phương thức setAccessible của sự phản ánh API lõi . Có thể sử dụng tùy chọn --add-opens, khi chạy, để thực hiện việc này.

tùy chọn dòng lệnh này tương đương với ví dụ: -

module jdk.unsupported { 
    opens sun.misc; 
} 

Một bình thường tên là mô-đun, ngược lại, được định nghĩa một cách rõ ràng với một tuyên bố mô-đun như: -

module foo { } 

và chúng được gọi là explicit modules. Các mô-đun rõ ràng có thể sử dụng chỉ thị trên các gói như đã nêu ở trên, ví dụ: export/open các gói để cung cấp truy cập phản chiếu cho các thành viên và lớp học tương ứng.


Mặt khác, một module OPEN là một mô-đun

rằng không tuyên bố bất kỳ gói mở nhưng các mô-đun kết quả là đối xử như thể tất cả các gói được mở .

như vậy mà nó cấp quyền truy cập khi chạy với các loại trong tất cả các gói của mô-đun như thể tất cả các gói được xuất khẩu có nghĩa là bytecode hoặc phản chiếu có thể được sử dụng để truy cập các lớp hoặc các thành viên của mỗi gói trong tất cả các gói. Các API phản chiếu với setAccessible hoặc MethodHandles.privateLookupIn cho phép phản ánh sâu sắc, vì vậy trong ngắn bạn có thể suy nghĩ về tất cả các thành viên của tất cả các lớp học ở tất cả các gói. Đó cũng là lý do tại sao trình biên dịch sẽ không cho phép both open directives to a package while the module is already open.

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