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类》 在Java编程中,sun.misc.UnSafe类是一个非常特殊的存在。这个类在JDK8中扮演着一个核心的角色,它提供了对Java语言规范中未公开的底层操作的访问。尽管UnSafe类并非设计为...
《深入解析Java sun.misc.Unsafe》 在Java编程语言中,`sun.misc.Unsafe`类是一个神秘而强大的工具,它提供了对内存的直接操作和访问,绕过了Java的一些安全限制。这个类通常不被推荐在生产环境中直接使用,因为它...
标题“JDK Unsafe 源码注释”和描述提示我们,接下来的内容将围绕JDK中非标准的Unsafe类进行。Unsafe类是Sun公司内部的一个类,它不是JDK标准API的一部分,而存在于sun.misc包中。虽然Oracle发行的JDK版本不包含...
### CS使用Unsafe的方法向DLL传参 #### 背景介绍 在跨语言编程中,经常会出现需要在不同编程语言间传递数据的情况。比如,在C#中调用C/C++编写的动态链接库(DLL)时,就可能遇到类型不匹配的问题。本文将通过一个...
在Visual Studio中,开发者可能会遇到一个警告或错误,提示"This function or variable may be unsafe",这是由于Microsoft引入的安全开发生命周期(Security Development Lifecycle, SDL)检查机制。该机制旨在提高...
JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com
对Netty中的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
Java中的`Unsafe`类是一个非常特殊的工具类,它位于`sun.misc`包下,不属于Java标准库的一部分。尽管如此,由于其强大的底层操作能力,它在许多高性能的Java框架和库中扮演着重要角色,例如Netty、Hadoop和Kafka。`...
《深入理解Java Unsafe类在JDK 1.5中的应用》 在Java编程语言中,`Unsafe`类是一个特殊的存在,它提供了对内存操作的直接访问权限,绕过了Java的一些安全机制。在JDK 1.5版本的`rt.jar`库中,`Unsafe`类扮演着一个...
本文深入解析Java并发编程中的两个关键类:Atomic和Unsafe。这些类在提高Java并发操作的效率和安全性方面扮演着至关重要的角色。原子操作的核心:原子操作是不可分割的操作单元,确保数据的一致性和完整性。Java通过...
《Java Unsafe类的深入解析与应用》 Java的Unsafe类是一个强大的工具,它位于rt.jar包中,提供了原子级别的操作,这些操作都是通过JNI(Java Native Interface)直接调用本地C++库实现的。Unsafe的存在是为了应对高...
Java中的`Unsafe`类是一个非常特殊且强大的工具类,它提供了对Java内存模型的底层访问。这个类在`sun.misc`包下,由于其潜在的危险性和不稳定性,官方并不推荐直接使用,甚至在Java 9之后有计划移除部分功能。然而,...
在Visual Studio(VS)开发环境中,当我们使用一些传统且可能引起安全问题的函数时,可能会遇到“此函数或变量可能不安全”的编译错误或警告。具体来说,这些安全检查错误通常是由于使用了诸如strcpy、scanf等老旧且...
在Java并发编程中,LockSupport和Unsafe是两个关键的工具类,它们提供了底层的线程控制功能,使得开发者能够深入地管理和控制线程的行为。LockSupport是Java并发库中的一个核心工具类,它提供了线程的阻塞和唤醒功能...
unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不存储对集合内对象的引用,而是直接将元素复制到列表中。 这有一些有趣的特性...
在JDK 1.8版本中,开发者对`sun.reflect`和`unsafe`这两个包进行了扩展,这为高级功能和性能优化提供了可能。 `sun.reflect`包是Java反射API的一部分,它包含了对Java类和接口的运行时表示以及动态访问的内部实现。...
Java多线程与并发处理是Java编程中的高级话题,涉及到JUC(java.util.concurrent)包中的原子类、CAS(Compare-And-Swap)机制、Unsafe类以及多线程并发的无锁方案和线程安全的实现方法。 CAS是一种无锁的同步机制...
Java中的`sun.misc.Unsafe`类是一个特殊的存在,它提供了对Java语言规范之外的底层操作的访问。这个类主要用于优化性能和实现一些JVM级别的功能,但同时也因为其潜在的安全风险和不稳定因素,通常不推荐在常规编程中...