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