import sun.misc.Unsafe;
import java.lang.reflect.Field;
public class Test
{
public static Unsafe getUnsafe()
{
try
{
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
boolean acc=unsafeField.isAccessible();
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
unsafeField.setAccessible(acc);
return unsafe;
} catch (NoSuchFieldException e)
{
e.printStackTrace();
} catch (IllegalAccessException e)
{
e.printStackTrace();
}
return null;
}
public static void main(String[] args)
{
Unsafe unsafe = getUnsafe();
if (unsafe!=null)
{
// Выделяем память и получаем указатели
long mem = unsafe.allocateMemory(100); // 100 байт
long mem2 = unsafe.allocateMemory(200); // 200 байт
System.out.println("mem="+mem);
System.out.println("mem2="+mem2);
// Пишем и читаем
unsafe.putInt(mem,1);
System.out.println("vl="+unsafe.getInt(mem));
// Пишем последовательно два числа, а затем считываем
// "между" ними (адресная арифметика)
// Так пишем: | 00 00 FF 00 | 00 00 00 00 |
// Так читаем: 00 00 | FF 00 00 00 | 00 00
unsafe.putInt(mem2+4,0x00FF0000);
unsafe.putInt(mem2+8,0);
System.out.println("v2="+unsafe.getInt(mem2+6));
// Освобождаем память
unsafe.freeMemory(mem);
unsafe.freeMemory(mem2);
// Считываем значение из объекта по смещению
try
{
Integer testI=new Integer(2);
// Получаем смещение поля внутри объекта
Field valueField = Integer.class.getDeclaredField("value");
long valueOffset = unsafe.objectFieldOffset(valueField);
System.out.println("Value offset: "+valueOffset);
// Читаем...
System.out.println("Test: "+unsafe.getInt(testI,valueOffset));
} catch (NoSuchFieldException e)
{
e.printStackTrace();
}
}
}
}