Статьи

Использование sun.misc.Unsafe в Java 9

Версия Java 9 EA вышла, и теперь мы можем видеть, как использовать sun.misc.Unsafe. Я возглавил публичную кампанию за сохранение доступа к ней в Java 9, которая в конечном итоге была успешной, что привело к внесению поправок в JEP 260 .

Итак, как все закончилось?

Начало настройки

Для начала нужно скачать Java 9 EA. Для IDE я использую IntelliJ IDEA. Вам нужен новый публичный предварительный просмотр 2017.1, который вышел 27 февраля 2017 года. Более ранние версии не работают с Java 9.

Модуль jdk.unsupported

sun.misc.Unsafe теперь доступен в модуле jdk.unsupported. Этот модуль присутствует в полных изображениях JRE и JDK.

Вот объявление модуля для jdk.unsupported:

1
2
3
4
5
6
7
8
module jdk.unsupported {
    exports sun.misc;
    exports sun.reflect;
    exports com.sun.nio.file;
  
    opens sun.misc;
    opens sun.reflect;
}

Как вы можете видеть, sun.misc экспортируется.

Используй это

У меня есть пример проекта с пакетом java9unsafe и модулем с тем же именем.

Чтобы использовать Unsafe, вам нужно добавить jdk.unsupported в объявление модуля вашего кода:

1
2
3
module java9unsafe {
    requires jdk.unsupported;
}

К счастью, IDEA обнаружит декларацию, если она отсутствует, и предложит добавить ее для вас, когда вы наведете указатель на импорт.

Тогда вы можете использовать Unsafe. Обратите внимание, что вы должны косвенно получить экземпляр Unsafe с помощью отражения, в противном случае вы получите исключение безопасности

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
module jdk.unsupported {
  
public class Java9Unsafe {
  
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        System.out.println("The address size is: " + getUnsafe().addressSize());
    }
  
    @SuppressWarnings("restriction")
    private static Unsafe getUnsafe() throws NoSuchFieldException, IllegalAccessException {
        Field singleoneInstanceField = Unsafe.class.getDeclaredField("theUnsafe");
        singleoneInstanceField.setAccessible(true);
        return (Unsafe) singleoneInstanceField.get(null);
    }
  
}

И ответ: Размер адреса: 8