Крім розуміння доступу до модулів та відповідних пакетів. Я вважаю, що суть цього полягає в модульній системі # Розслаблена-сильна капсуляція, і я б просто вишнево підбирав відповідні її частини, щоб спробувати відповісти на питання.
Що визначає незаконний відбиваючий доступ та які обставини викликають попередження?
Для сприяння переходу на Java-9, сильне капсулювання модулів може бути послаблене.
Реалізація може забезпечити статичний доступ , тобто шляхом складеного байтового коду.
Може забезпечити засіб виклику своєї системи запуску з одним або декількома пакетами одного або декількох модулів, відкритих для кодування у всіх неназваних модулях , тобто для кодування на classpath. Якщо система запущеного часу викликається таким чином, і якщо це зробити, деякі виклики API-інтерфейсів відображення досягають успіху, інакше вони б не змогли.
У таких випадках ви насправді зробили рефлексивний доступ, який є "незаконним", оскільки в чистому модульному світі вам не передбачалося робити такі доступи.
Як це все висить разом і що викликає попередження в якому сценарії?
Це розслаблення інкапсуляції контролюється під час виконання новою опцією запуску, --illegal-access
яка за замовчуванням у Java9 дорівнює permit
. У permit
режимі гарантує
Перша операція з відображенням доступу до будь-якого такого пакету викликає попередження, але попередження не надходять після цього. Це єдине попередження описує, як увімкнути подальші попередження. Це попередження не можна придушити.
Режими можна налаштувати зі значеннями debug
(повідомлення, а також стеження за кожним таким доступом), warn
(повідомлення для кожного такого доступу) та deny
(відключає такі операції).
Кілька речей для налагодження та виправлення програм:
- Запустіть його,
--illegal-access=deny
щоб ознайомитись і уникати відкриття пакетів від одного модуля до іншого без оголошення модуля, що включає таку директиву ( opens
) або явне використання --add-opens
VM arg.
- Статичні посилання зі скомпільованого коду на внутрішні API API JDK можна ідентифікувати за допомогою
jdeps
інструменту з --jdk-internals
можливістю
Попереджувальне повідомлення, яке видається при виявленні незаконної операції з відображенням, має таку форму:
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
де:
$PERPETRATOR
- це повністю кваліфіковане ім’я типу, що містить код, який викликав відповідну відображаючу операцію плюс джерело коду (тобто, JAR-файл-шлях), якщо такий є, і
$VICTIM
- рядок, який описує член, до якого звертаються, включаючи повністю кваліфіковане ім'я типу, що додається
Питання до такого зразка попередження: = JDK9: Виникла незаконна операція відображення доступу. org.python.core.PySystemState
Останнє та важливе зауваження, намагаючись упевнитись, що ви не стикаєтеся з подібними попередженнями та не будете безпечними у майбутньому, все, що вам потрібно зробити, це переконатися, що ваші модулі не роблять цих незаконних відбиваючих доступу. :)