1. Unsafe.copyMemory
1.1 如下代码实现字节数组的拷贝
import sun.misc.Unsafe;
import java.lang.reflect.Field;
public class UnsafeTest {
private static final Unsafe _UNSAFE;
private static final int BYTE_ARRAY_OFFSET;
private static final int INT_ARRAY_OFFSET;
static {
sun.misc.Unsafe unsafe;
try {
//通过反射获得Unsafe类的theUnsafe成员变量
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
//设置为可访问
unsafeField.setAccessible(true);
//theUnsafe是静态变量,可以通过null对象获取其值,获得的值就是Unsafe成员变量
unsafe = (sun.misc.Unsafe) unsafeField.get(null);
} catch (Throwable cause) {
cause.printStackTrace();
unsafe = null;
}
_UNSAFE = unsafe;
BYTE_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(byte[].class);
INT_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(int[].class);
}
public static void main(String[] args) {
System.out.println("======================BYTE ARRAY=======================");
byte[] src = new byte[]{1, 2, 3, 4, 5, 6};
byte[] dest = new byte[src.length];
_UNSAFE.copyMemory(src, BYTE_ARRAY_OFFSET, dest, BYTE_ARRAY_OFFSET, src.length);
for (byte b : dest) {
System.out.println(b);
}
System.out.println("=======================INT ARRAY=======================");
int[] isrc = new int[]{11,12,13,14,15,16};
int[] idest = new int[isrc.length];
_UNSAFE.copyMemory(isrc, INT_ARRAY_OFFSET, idest, INT_ARRAY_OFFSET,isrc.length * 4); //最后一个参数表示复制内存的长度
for (int ii : idest) {
System.out.println(ii);
}
}
}