一.获取Unsafe,通用的办法利用反射机制
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
二.Unsafe自己对调用者的检查
public static Unsafe getUnsafe() {
Class cc = sun.reflect.Reflection.getCallerClass(2);
if (cc.getClassLoader() != null)
throw new SecurityException("Unsafe");
return theUnsafe;
}
getCallerClass调用栈帧,从0开始。
0:getCallerClass方法的Reflection类;
1:getUnsafe方法的Unsafe类;
2:调用getUnsafe方法的所属类
比如:
public static void main(String[] args) throws Exception {
Class cc = sun.reflect.Reflection.getCallerClass(1);
//0:getCallerClass方法的Reflection类,1:main方法的所属类
}
cc.getClassLoader()!= null 用于判断类加载器是否是bootstrap classloader。
1.Bootstrap ClassLoader - GetClassLoader的返回值为Null,是JVM的C++源码,Ext ClassLoader 的Parent,主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作;
2.System ClassLoader - GetClassLoader返回值为SystemClassLoader.
主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作
3.Ext ClassLoader - 是AppClassLoader 的Parent 返回Ext ClassLoader
主要负责jdk_home/lib/ext目录下的jar包或-Djava.ext.dirs 指定目录下的jar包装入工作。
4.App ClassLoader - 返回AppClassLoader,主要负责加载用户类。
(后续在继续分析ClassLoader机制)
三:public native int getInt(Object o, long offset);注释中提到三种情况
第一种场景:The offset was obtained from {@link #objectFieldOffset} on the {@link java.lang.reflect.Field} of some Java field and the object referred to by <code>o</code> is of a class compatible with that field's class.
private int offset = 10;
public static void main(String[] args) throws Exception {
long fieldOffset = unsafe.objectFieldOffset(Main.class.getDeclaredField("offset")) ;
int fieldValue = unsafe.getInt(new Main(), fieldOffset);
}
第二种场景:The offset and object reference <code>o</code> (either null or non-null) were both obtained via{@link #staticFieldOffset} and {@link #staticFieldBase} (respectively) from the reflective {@link Field} representation of some Java field.
private static int staticoffset = 20;
public static void main(String[] args) throws Exception {
Field staticField = Main.class.getDeclaredField("staticoffset");
long staticFieldOffset = unsafe.staticFieldOffset(staticField);
Object obj = unsafe.staticFieldBase(staticField);
int staticFieldValue =unsafe.getInt(obj, staticFieldOffset);
}
第三种场景:The object referred to by <code>o</code> is an array, and the offset is an integer of the form <code>B+N*S</code>, where <code>N</code> is a valid index into the array, and <code>B</code> and <code>S</code> are the values obtained by {@link #arrayBaseOffset} and {@link #arrayIndexScale} (respectively) from the array's class. The value referred to is the <code>N</code><em>th</em> element of the array.
public static void main(String[] args) throws Exception {
int [] intarray = new int[3];
intarray[0] = 10; intarray[1] = 20; intarray[2] = 30;
int arrayOffset = unsafe.arrayBaseOffset(intarray.getClass());
int arrayScale = unsafe.arrayIndexScale(intarray.getClass());
long lg = arrayOffset + 2 * arrayScale;
int arrayValue = unsafe.getInt(intarray, lg);
}
分享到:
相关推荐
"sun"前缀的源码主要涉及以下几个关键领域: 1. **NIO(Non-blocking I/O)**:Java的非阻塞I/O模型,提供了通道(Channel)和选择器(Selector)等概念,极大地提高了处理大量并发连接的能力。在`sun.nio`包下,你...
`Unsafe`类包含大量本地方法,大致分为以下几个类别: 1. **Class相关**:提供对`Class`对象和静态字段的操作,如获取字段的内存偏移量。 2. **Object相关**:操作对象和其字段,如设置或获取字段的值,以及对象的...
`Unsafe`类提供的功能包括但不限于以下几个方面: 1. **内存管理**:可以直接在堆外分配内存,这对于大容量数据的存储非常有用,可以避免频繁的垃圾回收操作。例如,通过`allocateMemory`方法可以分配一块连续的...
打开DLL文件的步骤通常包括以下几点: 1. **初始化JNI**: 首先,Java代码需要声明一个本地方法,并使用`System.loadLibrary("javacypt")`来指示JVM加载名为"javacypt"的库(对应于javacypt.dll)。 2. **定义JNI函数...
为了运行这个示例,需要在程序中初始化`Unsafe`实例,这通常通过反射访问`sun.misc.Unsafe`的私有字段`theUnsafe`实现: ```java private static final Unsafe unsafe; static { try { Field field = Unsafe....
在Java 1.7中,`sun`包下有许多关键的类,比如`java.lang.reflect包`中的`sun.misc.Unsafe`,这是一个强大的工具类,允许开发者访问和修改内存,执行低级别的操作,但同时也可能导致不安全的代码。 总的来说,这个...
在Java中,CAS操作是通过`Unsafe`类实现的,这个类位于`sun.misc`包下,提供了对内存的直接访问和原子操作。 `Unsafe`类是一个非常强大的工具,但同时也非常危险,因为它允许程序员绕过Java的内存安全机制,直接...
Java面试中的核心知识点主要包括以下几个方面: 1. **volatile关键字**: - volatile是Java提供的一种轻量级同步机制,它可以确保变量在多个线程环境下的可见性。 - 使用volatile的变量不会被线程局部缓存,而是...
在Java编程语言中,Unsafe是一个特殊的类,它位于Java的标准类库之外,位于sun.misc包下。由于这个类的特殊性质,它没有被正式列入Java官方文档,但它提供了对Java虚拟机中底层操作的直接访问,允许开发者执行一些低...
LockSupport的park方法在内部是通过unsafe(sun.misc.Unsafe)类的park方法实现的。这个方法是本地的,意味着它直接在底层操作系统级别进行线程的阻塞和解除阻塞操作,因此效率较高。 LockSupport允许先unpark再...
在Java中实现Misty1算法,我们需要了解以下几个关键知识点: 1. **分组密码基础**:Misty1是一个分组密码,这意味着它处理固定长度的数据块,而非任意长度的输入。在Java中,我们需要将输入数据分割成64位(8字节)...
7. **新的反射API**:Java 1.8对反射API进行了优化,增加了更方便的类`sun.misc.Unsafe`,提供了对类和对象内存布局的访问,提升了性能和灵活性。 8. **Optional类**:为了减少空指针异常(NullPointerException)...
- **Unsafe.allocateInstance**:在特定情况下,可以使用sun.misc.Unsafe类的allocateInstance()方法直接在堆上创建对象,但这通常是不推荐的,因为它绕过了常规的构造函数调用。 2. **对象的创建过程** 创建一个...
1. **使用Java API**:Java 9及以上版本引入了一个名为`sun.misc.Unsafe`的API,虽然它不是公开的,但可以通过反射访问。`Unsafe`类提供了一个`objectFieldOffset`方法,可以获取特定字段在对象内部的偏移量,从而...
9. **新的反射API**:JDK 8提供了`sun.misc.Unsafe`的替代品,`java.lang.invoke.MethodHandle`和`MethodHandles`,提供了一种更安全、高效的反射机制。 10. **Nashorn JavaScript引擎**:JDK 8包含了Nashorn ...
6. **JVM接口**:虽然JDK源代码不包含JVM本身,但`sun.misc`和`sun.reflect`包提供了一些与JVM交互的接口,如`Unsafe`类,它允许我们执行一些底层操作。 7. **国际化与本地化**:`java.text`和`java.util.locale`包...
- **使用 sun.misc.Unsafe**:这是Java的一个非公开API,可以直接操作内存,性能优于常规反射,但使用需谨慎,因为它可能会破坏JVM的稳定性。 4. **性能测试与优化**: 运行基准测试来衡量不同反射优化策略的效果...
例如,"sun.misc"包中的一些关键类,如`Unsafe`,虽然不在OpenJDK中,但我们可以从文档、社区讨论和已有的开源项目中了解到它们的功能和用法,比如内存操作、反射优化等。 在OpenJDK 1.8的源码中,我们能够深入学习...
高并发编程第三阶段12讲 sun.misc.Unsafe介绍以及几种Counter方案性能对比.mp4 高并发编程第三阶段13讲 一个JNI程序的编写,通过Java去调用C,C++程序.mp4 高并发编程第三阶段14讲 Unsafe中的方法使用,一半是...
- **示例**:通过`sun.misc.Unsafe`类或`ByteBuffer.allocateDirect()`方法分配直接内存。 2. **常用JVM调优参数**: - `-Xmx`:设置最大堆内存大小。 - `-Xms`:设置初始堆内存大小,默认值通常是256MB。 - `-...