栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java基础——Unsafe

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java基础——Unsafe

一、概述

sun.mics.Unsafe类。
这是个Unsafe,虽然用它可以直接操作内容了,但是相应的会带来很多安全隐患。
Unsafe的构造器是私有的,直接new不行,截取部分源码:

public final class Unsage{
	private Unsafe() {
    }

    @CallerSensitive
    public static Unsafe getUnsafe() {
        Class var0 = Reflection.getCallerClass();
        if (!VM.isSystemDomainLoader(var0.getClassLoader())) {
            throw new SecurityException("Unsafe");
        } else {
            return theUnsafe;
        }
    }
}

而且会检查调用getUnsafe()方法的类加载器是不是Bootstrap类加载器,不是就抛出异常,我们直接调用的话,是App类加载器。
为了能访问到私有构造函数,首先我们得把安全检查关掉,类似这样:

	try{
    	Constructor constructor = Thing.class.getConstructor();
        constructor.setAccessible(true);
    }catch(NoSuchMethodException e){
        e.printStackTrace();
    }

既然new不行,那么想要创建实例的话,我们可以借助反射机制或者是构造器:

	Constructor constructor1 = Unsafe.class.getConstructor();

    // 通过构造器
    Unsafe unsafe = constructor1.newInstance();

    // 通过字段
    Field field = Unsafe.class.getDeclaredField("theUnsafe");
    field.setAccessible(true);
    Unsafe unsafe1 = (Unsafe) field.get(null);

	// 创建实例
	Thing thing = (Thing) unsafe.allocateInstance(Thing.class);
    Thing thing1 = (Thing) unsafe1.allocateInstance(Thing.class);
二、方法

主要围绕内存地址入口,地址偏移量。
这里不具体展开了,只列举了几个,有兴趣的可以查阅资料进一步了解。

1、allocateInstance()

这个就是用来创建实例的:

	Thing thing = (Thing) unsafe.allocateInstance(Thing.class);

借助unsafe实例,不需要通过构造器。

2、putObject()

修改对象成员变量。

3、compareAndSwapInt()

修改int属性值,原子操作。

4、allocateMemory()

分配内存。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677546.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号