Какая разница между --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).