Как заменить Unsafe на VarHandle или внешний APIJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как заменить Unsafe на VarHandle или внешний API

Сообщение Anonymous »

Мне было трудно удалить использование Unsafe и заменить его на VarHandle или MemorySegment/

Код: Выделить всё

MemoryLayout. Цель состоит в том, чтобы исключить использование Unsafe и заменить его неустаревшими API.
Два примера:
private static long methodA(Buffer x) {
return UNSAFE.getLong(x, addressFieldOffset);
}
и

Код: Выделить всё

private static Object methodB(ByteBuffer x) {
return UNSAFE.getObject(x, hbFieldOffset);
}
Во-первых, создание правильного VarHandle или MemorySegment оказалось непростой задачей. Кажется, когда я в конечном итоге использую предложенное в документации «Использовать VarHandle.get() или MemorySegment.get(ValueLayout.ofLong, long)», я получаю исключение WrongMethodTypeException или другое результат, чем раньше, нарушает текущие тесты и т. д. Могу ли я получить помощь по правильному использованию?
Я пробовал:

Код: Выделить всё

MemorySegment segment = MemorySegment.ofBuffer(x);

Код: Выделить всё

long result = segment.get(ValueLayout.ofLong, int offset) // I've tried several different layouts and different offsets,
либо получено исключение WrongMethodTypeException, либо несовместимая ошибка смещения
Также пробовал:

Код: Выделить всё

MemorySegment segment = MemorySegment.ofArray(new long[10]); // also tried with byte[10] and int[10]
С varHandle я пробовал:

Код: Выделить всё

VarHandle handle = MethodHandles.arrayElementVarHandle(long[].class); \\ also tried byte[].class, int[].class, and long[].class

Buffer bufferField = Buffer.allocate(16)

VarHandle handle = MethodHandles.lookup().findStaticVarHandle(ClassIAmIn.class, "bufferField", Buffer.class);
Обычно получается сообщение «Невозможно преобразовать MethodHandles(VarHandle, Buffer, long) в (VarHandle)Buffer» или что-то в этом роде.

Подробнее здесь: https://stackoverflow.com/questions/790 ... oreign-api
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как заменить Unsafe на VarHandle или внешний API
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • VarHandle для сегмента внешней памяти Java без проверки границ в Java 21
    Гость » » в форуме JAVA
    0 Ответы
    37 Просмотры
    Последнее сообщение Гость
  • Где найти реализацию java.lang.invoke.VarHandle.compareAndSet()?
    Anonymous » » в форуме JAVA
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Где найти реализацию java.lang.invoke.VarHandle.compareAndSet()?
    Anonymous » » в форуме JAVA
    0 Ответы
    70 Просмотры
    Последнее сообщение Anonymous
  • VarHandle для массивов динамического размера
    Anonymous » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»