Невозможно экспортировать пакет из 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;
}

структура каталогов теперь выглядит так, как показано на рисунке -

Directory Structure

в 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) код.