通过Unsafe类验证Java虚拟机对boolean类型的掩码操作

1. 示例代码

public class User {
    private boolean sex;

    public boolean isSex() {
        return sex;
    }

    public void setSex(boolean sex) {
        this.sex = sex;
    }
}
import sun.misc.Unsafe;

import java.lang.reflect.Field;

public class Main {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Field f = Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        Unsafe unsafe = (Unsafe) f.get(null);

        User user = new User();
        Field flagField = User.class.getDeclaredField("sex");

        unsafe.putByte(user, unsafe.objectFieldOffset(flagField), (byte) 2);
        System.out.println(user.isSex()); // false

        unsafe.putByte(user, unsafe.objectFieldOffset(flagField), (byte) 3);
        System.out.println(user.isSex()); // true
    }
}

2. 结论

通过直接对boolean值的内存地址直接赋值,

当赋值 2 -> 二级制10,取0,得到false;

当赋值 3 -> 二级制11,取1,得到true.

猜你喜欢

转载自blog.csdn.net/u013453970/article/details/81252476