package com.test.jdk.curren;
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class UnsafeTest {
private static Unsafe unsafe;
static {
try {
//通過反射獲取rt.jar下的Unsafe類
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (Unsafe) field.get(null);
} catch (Exception e) {
System.out.println("Get Unsafe instance occur error"+ e);
}
}
public static void main(String[] args) throws Exception
{
Class clazz = Target.class;
Field[] fields = clazz.getDeclaredFields();
System.out.println("字段名稱:字段位置");
for (Field f : fields) {
// 獲取屬性偏移量,可以通過這個偏移量給屬性設置
System.out.println(f.getName() + ":" + unsafe.objectFieldOffset(f));
}
Target target = new Target();
Field intFiled = clazz.getDeclaredField("intParam") ;
int a=(Integer)intFiled.get(target ) ;
System.out.println("intParam原始值是:"+a);
//intParam的字段偏移是12 原始值是3 我們要改爲10
System.out.println("修改intParam:"+unsafe.compareAndSwapInt(target, 12, 3, 10));
int b=(Integer)intFiled.get(target) ;
System.out.println("intParam改變之後的值是:"+b);
System.out.println("intParam改變之後的值是:"+target.intParam);
//這個時候已經改爲10了,所以會返回false
System.out.println(unsafe.compareAndSwapInt(target, 12, 3, 10));
//修改strParam字符串爲 null 爲 "5"
System.out.println(unsafe.compareAndSwapObject(target, 24, null, "5"));
}
}
class Target {
int intParam=3;
long longParam;
String strParam;
String strParam2;
}
Unsafe的 用法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.