JAVA基礎:Unsafe類

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章