Allows more convenient access to java's Unsafe API.
To access objects use ObjectMemory class. Methods require to pass object reference and field offset. To get field offset use fieldOffset method.
SomeClass obj = new SomeClass();
obj.field1 = 123;
long longField = ObjectMemory.fieldOffset(SomeClass.class, "field1");
long value = ObjectMemory.getLong(obj, longField);
To access arrays use ArrayMemory class. Methods require to pass array reference and offset or index. Offset is calculated as offset for first element
and element index multiplied by element size. To get first element's offset use firstElementOffset method.
int value = ArrayMemory.getInt(array, 4);
long offset = ArrayMemory.firstElementOffset() + 2 * SystemTypeSizes.intSize();
int value = ArrayMemory.getInt(array, offset);
Sizes for types are available through SystemTypeSizes class.
To access native memory use OffHeapMemory class.
long address = OffHeapMemory.allocate(100 * SystemTypeSizes.intSize());
long offset = SystemTypeSizes.intSize() * 10;
OffHeapMemory.setInt(address + offset, 123);
int value = OffHeapMemory.getInt(address + offset);
OffHeapMemory.free(address);
Be aware native memory should be freed manually.
Class MemoryFence allows to class memory fences. There are store, load and full fences provided by JVM.
MemoryFence.full();
Packages are available through Maven Central repository.
<dependency>
<groupId>io.github.thepun</groupId>
<artifactId>unsafe-utils</artifactId>
<version>1.1</version>
</dependency>
compile group: 'io.github.thepun', name: 'unsafe-utils', version: '1.1'