Как заменить 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 МБ.

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