如何使用Unsafe

该博客展示了在Java中如何通过反射获取并使用`sun.misc.Unsafe`类,以获取对象字段的偏移量。在尝试直接访问`Unsafe.getUnsafe()`时遇到了`SecurityException`,然后通过设置访问权限成功获取了`Unsafe`实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import sun.misc.Unsafe;

/**
 * @author woniu
 * @date 2022/6/3 12:07
 **/
public class Test {

    private static final Unsafe unsafe = Unsafe.getUnsafe();

    private String head;
    
    private static final long headOffset;

    static {
        try {
            headOffset = unsafe.objectFieldOffset
                    (TestCAS.class.getDeclaredField("head"));
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        System.out.println(headOffset);
    }
}

会有如下异常:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.SecurityException: Unsafe
	at sun.misc.Unsafe.getUnsafe(Unsafe.java:90)

那正确的方式是:

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * @author woniu
 * @date 2022/6/3 11:46
 **/
public class TestCAS {

    private static final Unsafe unsafe;

    private static final long headOffset;

    private transient volatile String head;

    static {
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            unsafe = (Unsafe) field.get(null);
            headOffset = unsafe.objectFieldOffset
                    (TestCAS.class.getDeclaredField("head"));
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }

    }

    public static void main(String[] args) {
            System.out.println(headOffset);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值