Невозможно экспортировать пакет из java.базовый модуль
использование IDEA-EAP для экспериментов по разработке JDK9.
Я получаю следующую ошибку -
Error:(3, 20) java: package jdk.internal.misc is not visible (package jdk.internal.misc is declared in module java.base, which does not export it to module com.jigsaw.npe)
определение класса ас -
package experiment;
import jdk.internal.misc.Unsafe;
public class CompareAndSwap {
static Unsafe UNSAFE = Unsafe.getUnsafe();
...
}
Я пробовал включить module-info.java
файл, а также внутри модуля, созданного с помощью IDE со следующими утверждениями -
module com.jigsaw.npe {
requires java.base;
}
структура каталогов теперь выглядит так, как показано на рисунке -
в IDE хотя отражает module-info.java
как неиспользуемый и, вероятно, это причина, по которой я не могу определить module com.jigsaw.npe
как пытались выше.
Ищу некоторую помощь о том, как правильно разместить модуль-инфо.java и / или что-то еще, кроме того, что я пропустил.
2 ответов
ответ Николая правильно в отношении методов, необходимых для экспорта в противном случае несообщаемого пакета из java.base
модуль или от любого другого модуля.
но если цель состоит в том, чтобы использовать Unsafe
, способ сделать это с помощью sun.misc.Unsafe
, который экспортируется в jdk.unsupported
модуль. Если вы компилируете свой код для неназванного модуля, вам не нужно делать ничего особенного в отношении модулей, чтобы получить к нему доступ. Если вы компилируете код в модуле, вам нужно добавить
requires jdk.unsupported;
на .
использовать Unsafe
вы должны сделать светоотражающий setAccessible
техника для получения доступа к полю, которая такая же, как и в предыдущих выпусках JDK:
import sun.misc.Unsafe;
...
Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeField.setAccessible(true);
Unsafe theUnsafe = (Unsafe)theUnsafeField.get(null);
хотя Unsafe
- в jdk.unsupported
модуль, этот метод поддерживается в JDK 9, в соответствии с JEP 260.
модуль java.база не экспорт пакета jdk.internal.misc.
, Так типа jdk.internal.misc.Unsafe
не работает - как следствие компиляция завершается с ошибкой.
вы можете заставить его экспортировать пакет, добавив следующую опцию командной строки:
# if you want to access it from com.jigsaw.npe only:
--add-exports java.base/jdk.internal.misc=com.jigsaw.npe
# if you want to access from all code:
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED
вам придется сделать это при компиляции (javac
) и при запуске (java
) код.