Какая разница между --add-export и -add-открывается в Java 9?
Java 9 (jdk-9 + 170) по умолчанию не позволяет приложению видеть все классы из JDK, в отличие от всех предыдущих версий Java, из-за новой системы модулей.
Чтобы обойти это, командная строка java
предлагает новый аргумент --add-exports
, который позволяет разбить инкапсуляцию следующим образом:
java -jar josm.jar --add-exports java.base/sun.security.util=ALL-UNNAMED --add-exports java.base/sun.security.x509=ALL-UNNAMED
Это хорошо объяснено в JEP 261.
Я читал о подобном варианте --add-opens
, используя тот же синтаксис, но JEP 261 еще не обновлен для его описания (последнее обновление: 2017/03/08 13:58).
В чем разница между этими двумя параметрами?
EDIT: JEP 261 обновлен в 2017-09-22, чтобы объяснить это.
Ответы
Ответ 1
- С
--add-exports
пакет экспортируется, что означает, что все общедоступные типы и члены доступны в момент компиляции и запуска.
- С
--add-opens
пакет открывается, что означает, что все типы и члены (а не только общедоступные) доступны там во время выполнения.
Таким образом, основное различие во время выполнения заключается в том, что --add-opens
допускает "глубокое отражение", что означает доступ непубличных участников. Обычно вы можете идентифицировать этот вид доступа с помощью отражающего кода, вызывающего вызовы на setAccessible(true)
.