Ngoài sự hiểu biết về các truy cập giữa các mô-đun và các gói tương ứng của chúng. Tôi tin rằng mấu chốt của nó nằm ở Hệ thống mô-đun # Thư giãn-mạnh-đóng gói và tôi sẽ chỉ chọn những phần có liên quan của nó để thử và trả lời câu hỏi.
Điều gì xác định một truy cập phản chiếu bất hợp pháp và những trường hợp nào kích hoạt cảnh báo?
Để hỗ trợ việc di chuyển sang Java-9, việc đóng gói mạnh mẽ các mô-đun có thể được nới lỏng.
Việc triển khai có thể cung cấp quyền truy cập tĩnh , tức là bằng mã bytecode đã được biên dịch.
Có thể cung cấp một phương tiện để gọi hệ thống thời gian chạy của nó với một hoặc nhiều gói của một hoặc nhiều mô-đun của nó được mở để mã trong tất cả các mô-đun chưa được đặt tên , tức là mã trên classpath. Nếu hệ thống thời gian chạy được gọi theo cách này và nếu bằng cách này, một số lệnh gọi của các API phản chiếu thành công nếu không thì chúng sẽ không thành công.
Trong những trường hợp như vậy, bạn thực sự đã thực hiện một truy cập phản chiếu là "bất hợp pháp" vì trong một thế giới mô-đun thuần túy, bạn không có ý định thực hiện những truy cập như vậy.
Làm thế nào tất cả kết hợp với nhau và điều gì kích hoạt cảnh báo trong trường hợp nào?
Việc nới lỏng đóng gói này được kiểm soát trong thời gian chạy bởi một tùy chọn trình khởi chạy mới --illegal-access
mà theo mặc định trong Java9 bằng permit
. Các permit
Đảm bảo chế độ
Thao tác truy cập phản chiếu đầu tiên đối với bất kỳ gói nào như vậy gây ra cảnh báo được đưa ra, nhưng không có cảnh báo nào được đưa ra sau thời điểm đó. Cảnh báo duy nhất này mô tả cách bật các cảnh báo khác. Cảnh báo này không thể bị dập tắt.
Các chế độ có thể được cấu hình với các giá trị debug
(thông báo cũng như ngăn xếp cho mỗi lần truy cập như vậy), warn
(thông báo cho mỗi lần truy cập như vậy) và deny
(vô hiệu hóa các hoạt động đó).
Một số điều cần gỡ lỗi và sửa chữa trên các ứng dụng sẽ là: -
- Chạy nó với
--illegal-access=deny
để biết và tránh mở các gói ing từ mô-đun này sang mô-đun khác mà không có khai báo mô-đun bao gồm chỉ thị như vậy ( opens
) hoặc sử dụng rõ ràng --add-opens
VM arg.
- Các tham chiếu tĩnh từ mã đã biên dịch tới các API nội bộ JDK có thể được xác định bằng cách sử dụng
jdeps
công cụ với --jdk-internals
tùy chọn
Thông báo cảnh báo được đưa ra khi phát hiện hoạt động truy cập phản chiếu bất hợp pháp có dạng sau:
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
Ở đâu:
$PERPETRATOR
là tên đủ điều kiện của loại chứa mã đã gọi hoạt động phản chiếu được đề cập cùng với nguồn mã (tức là đường dẫn tệp JAR), nếu có, và
$VICTIM
là một chuỗi mô tả thành viên đang được truy cập, bao gồm tên đủ điều kiện của loại bao quanh
Câu hỏi cho một cảnh báo mẫu như vậy: = JDK9: Đã xảy ra hoạt động truy cập phản chiếu bất hợp pháp. org.python.core.PySystemState
Lưu ý cuối cùng và quan trọng, trong khi cố gắng đảm bảo rằng bạn không gặp phải những cảnh báo như vậy và an toàn trong tương lai, tất cả những gì bạn cần làm là đảm bảo các mô-đun của bạn không thực hiện những truy cập phản chiếu bất hợp pháp đó. :)