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 若不是 請賜教