`

Unsafe

阅读更多
Unsafe


一、总结

1.jdk 1.8.0

2.不可仿照 AtomicInteger 的方式直接调用 Unfase
// 声明全局的静态变量,运行时会出现异常 SecurityException("Unsafe")
private static final Unsafe unsafe = Unsafe.getUnsafe();


3.从源码注释得知,这个类是用于执行低级别、不安全操作的方法集合。尽管这个类和所有的方法都是公开的(public),但是这个类的使用仍然受限,你无法在自己的java程序中直接使用该类,因为只有授信的代码才能获得该类的实例。所以我们平时的代码是无法使用这个类的,因为其设计的操作过于偏底层,如若操作不慎可能会带来很大的灾难,所以直接禁止普通代码的访问,当然JDK使用是没有问题的。

二、源码分析

// 获取类中属性在对象中的地址的偏移量,即以堆中开辟的对象空间的起始地址为基址
// 相对于此值的偏移地址;根据对象的起始位置和偏移量可确认该属性在堆中的存放位置
// 进而可以获取到此属性的值
public native long objectFieldOffset(Field field);


// 示例
// 通过获取类中属性的偏移量,配合对象的地址,获取该属性的值
import java.lang.reflect.Field;

import sun.misc.Unsafe;

public class ObjectMain {

	private int a ;
	private int b ;
	private String str ;

	/**
	 * @param args
	 * @throws SecurityException 
	 * @throws NoSuchFieldException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		Unsafe unsafe = getUnsafeInstance();
		// 获取实例字段的偏移地址,偏移最小的那个字段(仅挨着头部)就是对象头的大小  
		long objectFieldOffseta = unsafe.objectFieldOffset(ObjectMain.class.getDeclaredField("a"));
		long objectFieldOffsetb = unsafe.objectFieldOffset(ObjectMain.class.getDeclaredField("b"));
		System.out.println(objectFieldOffseta);
		System.out.println(objectFieldOffsetb);
		// 通过偏移量和对象的基址
		ObjectMain main = new ObjectMain();
		main.setA(10);
		Integer resultA = unsafe.getInt(main,objectFieldOffseta);
		System.out.println(resultA);
	}
	
	/**
	 * 通过反射获取Unsafe类中 theUnsafe 属性
	 * @return
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	private static Unsafe getUnsafeInstance() throws SecurityException, NoSuchFieldException, IllegalArgumentException,  
    IllegalAccessException {  
		Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");  
		theUnsafeInstance.setAccessible(true);  
		return (Unsafe) theUnsafeInstance.get(Unsafe.class);  
	}  
	
	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public int getB() {
		return b;
	}
	
	public void setB(int b) {
		this.b = b;
	}

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}

}



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

    private static final Unsafe theUnsafe;
    static 
    {
        registerNatives();
        Reflection.registerMethodsToFilter(sun/misc/Unsafe, new String[] {
            "getUnsafe"
        });
        theUnsafe = new Unsafe();
    }
    
    private static native void registerNatives();



博文参考:
java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值
Java之美[从菜鸟到高手演练]之atomic包的原理及分析
分享到:
评论

相关推荐

    JDK8中sun.misc下UnSafe类源代码 UnSafe.java

    《深入解析JDK8中的sun.misc.UnSafe类》 在Java编程中,sun.misc.UnSafe类是一个非常特殊的存在。这个类在JDK8中扮演着一个核心的角色,它提供了对Java语言规范中未公开的底层操作的访问。尽管UnSafe类并非设计为...

    sun.misc.Unsafe源码

    《深入解析Java sun.misc.Unsafe》 在Java编程语言中,`sun.misc.Unsafe`类是一个神秘而强大的工具,它提供了对内存的直接操作和访问,绕过了Java的一些安全限制。这个类通常不被推荐在生产环境中直接使用,因为它...

    JDK Unsafe 源码注释

    标题“JDK Unsafe 源码注释”和描述提示我们,接下来的内容将围绕JDK中非标准的Unsafe类进行。Unsafe类是Sun公司内部的一个类,它不是JDK标准API的一部分,而存在于sun.misc包中。虽然Oracle发行的JDK版本不包含...

    CS使用Unsafe的方法向DLL传参

    ### CS使用Unsafe的方法向DLL传参 #### 背景介绍 在跨语言编程中,经常会出现需要在不同编程语言间传递数据的情况。比如,在C#中调用C/C++编写的动态链接库(DLL)时,就可能遇到类型不匹配的问题。本文将通过一个...

    解决VS中This function or variable may be unsafe的安全检查错误.docx

    在Visual Studio中,开发者可能会遇到一个警告或错误,提示"This function or variable may be unsafe",这是由于Microsoft引入的安全开发生命周期(Security Development Lifecycle, SDL)检查机制。该机制旨在提高...

    JDK8中sun.misc包下的UnSafe类

    JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com

    netty-unsafe总结

    对Netty中的Unsafe做了简单的总结,构建自己的知识网!!!

    c# winform 把彩色图片转换为灰色的图片,变灰,灰度图片,速度很快,safe,unsafe

    public static unsafe void ConvertToGray(Bitmap sourceBitmap) { BitmapData sourceData = sourceBitmap.LockBits(new Rectangle(0, 0, sourceBitmap.Width, sourceBitmap.Height), ImageLockMode.ReadOnly, ...

    System.Runtime.CompilerServices.Unsafe.dll

    System.Runtime.CompilerServices.Unsafe

    一篇看懂Java中的Unsafe类

    Java中的`Unsafe`类是一个非常特殊的工具类,它位于`sun.misc`包下,不属于Java标准库的一部分。尽管如此,由于其强大的底层操作能力,它在许多高性能的Java框架和库中扮演着重要角色,例如Netty、Hadoop和Kafka。`...

    Unsafe_jdk1.5_rt.jar

    《深入理解Java Unsafe类在JDK 1.5中的应用》 在Java编程语言中,`Unsafe`类是一个特殊的存在,它提供了对内存操作的直接访问权限,绕过了Java的一些安全机制。在JDK 1.5版本的`rt.jar`库中,`Unsafe`类扮演着一个...

    Java Unsafe类的使用.docx

    《Java Unsafe类的深入解析与应用》 Java的Unsafe类是一个强大的工具,它位于rt.jar包中,提供了原子级别的操作,这些操作都是通过JNI(Java Native Interface)直接调用本地C++库实现的。Unsafe的存在是为了应对高...

    Java Unsafe类1

    Java中的`Unsafe`类是一个非常特殊且强大的工具类,它提供了对Java内存模型的底层访问。这个类在`sun.misc`包下,由于其潜在的危险性和不稳定性,官方并不推荐直接使用,甚至在Java 9之后有计划移除部分功能。然而,...

    解决VS中This function or variable may be unsafe的安全检查错误.pdf

    在Visual Studio(VS)开发环境中,当我们使用一些传统且可能引起安全问题的函数时,可能会遇到“此函数或变量可能不安全”的编译错误或警告。具体来说,这些安全检查错误通常是由于使用了诸如strcpy、scanf等老旧且...

    Java并发编程之LockSupport、Unsafe详解.docx

    在Java并发编程中,LockSupport和Unsafe是两个关键的工具类,它们提供了底层的线程控制功能,使得开发者能够深入地管理和控制线程的行为。LockSupport是Java并发库中的一个核心工具类,它提供了线程的阻塞和唤醒功能...

    unsafe:使用sun.misc.Unsafe的各种Java类

    unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不存储对集合内对象的引用,而是直接将元素复制到列表中。 这有一些有趣的特性...

    jdk1.8的src,扩展了sun.reflect,unsafe

    在JDK 1.8版本中,开发者对`sun.reflect`和`unsafe`这两个包进行了扩展,这为高级功能和性能优化提供了可能。 `sun.reflect`包是Java反射API的一部分,它包含了对Java类和接口的运行时表示以及动态访问的内部实现。...

    Java 多线程与并发(8-26)-JUC原子类- CAS, Unsafe和原子类详解.pdf

    Java多线程与并发处理是Java编程中的高级话题,涉及到JUC(java.util.concurrent)包中的原子类、CAS(Compare-And-Swap)机制、Unsafe类以及多线程并发的无锁方案和线程安全的实现方法。 CAS是一种无锁的同步机制...

    Java中的魔法类:sun.misc.Unsafe示例详解

    Java中的`sun.misc.Unsafe`类是一个特殊的存在,它提供了对Java语言规范之外的底层操作的访问。这个类主要用于优化性能和实现一些JVM级别的功能,但同时也因为其潜在的安全风险和不稳定因素,通常不推荐在常规编程中...

    go中的unsafe包及使用详解

    Go语言中的unsafe包是Go语言标准库中的一个特殊的包,其设计目的是为了那些需要绕过Go语言类型安全和内存安全检查的情况提供支持。unsafe包中的函数和类型并不受Go编译器安全检查的保护,使用不当可能会导致内存破坏...

Global site tag (gtag.js) - Google Analytics