Невозможно экспортировать пакет из модуля 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) код.

Другие вопросы по тегам