Unsafe来自于sun.misc.Unsafe
通常在sun包并不是标准的J2SE,所以在android studio中会被标红
在android中有两个Utils可以帮转我们获取Unsafe对象
1.UnsafeUtils 来自
* Helper class basically allowing to get access to {@code sun.misc.Unsafe}
package org.objenesis.instantiator.util;
获取对象:UnsafeUtils.getUnsafe();
2.UnsafeUtil来自
package com.esotericsoftware.kryo.util
* A few utility methods for using @link{sun.misc.Unsafe}, mostly for private
* use.
*
* Use of Unsafe on Android is forbidden, as Android provides only a very limited
* functionality for this class compared to the JDK version.
获取对象: UnsafeUtil.unsafe();
貌似这个类不是给android用的,看源码:
if (!Util.isAndroid) {
java.lang.reflect.Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
tmpUnsafe = (sun.misc.Unsafe)field.get(null);
tmpByteArrayBaseOffset = tmpUnsafe.arrayBaseOffset(byte[].class);
tmpCharArrayBaseOffset = tmpUnsafe.arrayBaseOffset(char[].class);
tmpShortArrayBaseOffset = tmpUnsafe.arrayBaseOffset(short[].class);
tmpIntArrayBaseOffset = tmpUnsafe.arrayBaseOffset(int[].class);
tmpFloatArrayBaseOffset = tmpUnsafe.arrayBaseOffset(float[].class);
tmpLongArrayBaseOffset = tmpUnsafe.arrayBaseOffset(long[].class);
tmpDoubleArrayBaseOffset = tmpUnsafe.arrayBaseOffset(double[].class);
}
static public boolean isAndroid = "Dalvik".equals(System.getProperty("java.vm.name"));
也就是说Dalvik的系统,unsafe对象是空的,而5.1以后基本是art了
这个类中进行了很多封装,使用更方便
3.自行反射获取
但在androidstudio中貌似没法使用Unsafe
Use of Unsafe on Android is forbidden 若不是 请赐教