Невозможно экспортировать пакет из модуля java.base
Использование 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
как пытались выше.
Нужна помощь в том, как правильно разместить module-info.java и / или что-то еще, кроме того, что я пропустил.
2 ответа
Николай дает верный ответ относительно методов, необходимых для экспорта в противном случае неэкспортированной упаковки из java.base
модуль или из любого другого модуля.
Но если цель состоит в том, чтобы использовать Unsafe
способ сделать это использовать sun.misc.Unsafe
который экспортируется jdk.unsupported
модуль. Если вы компилируете свой код для неназванного модуля, вам не нужно делать ничего особенного в отношении модулей, чтобы получить к нему доступ. Если вы компилируете код в модуле, вам нужно добавить
requires jdk.unsupported;
на ваш module-info.java
файл.
Использовать 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.base не экспортирует пакет 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
) код.