使用sun.misc.Unsafe获取java对象地址
来源:互联网 发布:iphone4 ios7越狱优化 编辑:程序博客网 时间:2024/06/07 03:01
在传统的Java编程中,你将不再需要从内存中处理Java对象或位置。 当你在论坛上讨论这一点,提出的第一个问题是为什么你需要知道Java对象的地址? 它是一种有效的问题。 但以往,我们保留进行试验的权利。探索未知领域的问题并没有什么错。我想出了一个使用sun公司包的实验。Unsafe是一个属于sun.misc包。对你来说可能这个包有点陌生,看看源代码和方法,你就可以知道我所指的是什么了。
Java的安全管理提供了足够的隐藏来确保你并不能那么容易的摆弄内存。作为第一步,我想到了要得到一个Java对象的内存位置。直到探索,我也曾经是100%的信心,这是不可能找到的位置 Java中对象的地址。
Sun的Unsafe.java API文档显示我们有机会获得地址使用方法objectFieldOffset。这个方法仿佛在说:“报告中的类存储分配它的位置在一个特定领域。“ 它还说,“这只是其中一个访问器的cookie传递给不安全堆内存“。 无论如何,我能够从它的类的存储分配存储一个对象的内存位置。你可以争辩说,我们所得到的是不是一个对象的绝对物理内存地址。但是,我们拿到了逻辑内存地址。下面的程序将受到你的有趣!
作为第一步,我得拿到Unsafe类的一个对象。这是很困难的,因为构造函数是私有的。 有一个名为getUnsafe一个方法,该方法返回不安全的对象。Java安全管理要求您给源代码特权。我用到了一点反射然后得到了一个实例。我知道有更好的方法来获得实例,但我选择了以下的方法来绕开安全管理。
使用Unsafe的对象,只需要调用objectFieldOffset和staticFieldOffset。结果就是类的内存分配地址。
以下的实例程序可以运行在JDK1.6上。
package lock;import sun.misc.Unsafe;import java.lang.reflect.Field;public class ObjectLocation { private static int apple = 10; private int orange = 10; public static void main(String[] args) throws Exception { Unsafe unsafe = getUnsafeInstance(); Field appleField = ObjectLocation.class.getDeclaredField("apple"); System.out.println("Location of Apple: " + unsafe.staticFieldOffset(appleField)); Field orangeField = ObjectLocation.class.getDeclaredField("orange"); System.out.println("Location of Orange: " + unsafe.objectFieldOffset(orangeField)); } private static Unsafe getUnsafeInstance() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafeInstance.setAccessible(true); return (Unsafe) theUnsafeInstance.get(Unsafe.class); }}
- 使用sun.misc.Unsafe获取java对象地址
- 使用sun.misc.Unsafe获取java对象地址
- 使用sun.misc.Unsafe
- Java sun.misc.Unsafe
- Java中的sun.misc.Unsafe
- java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值
- 聊聊序列化(二)使用sun.misc.Unsafe绕过new机制来创建Java对象
- sun.misc.unsafe类的使用
- sun.misc.unsafe类的使用
- sun.misc.unsafe类的使用
- sun.misc.unsafe类的使用
- sun.misc.unsafe类的使用
- sun.misc.unsafe类的使用
- sun.misc.unsafe类的使用
- sun.misc.unsafe魔术类的使用
- sun.misc.unsafe类的使用
- sun.misc.unsafe类的使用
- Java中的sun.misc.Unsafe包
- cocos2d-x学习笔记(四)动作(Action)
- Longest Common Prefix
- 实现分页显示多页页数的动态变化
- 黑马程序员-学习日记22(java高新技术2)
- 强大而简单的复制表
- 使用sun.misc.Unsafe获取java对象地址
- Debug与Release版本的区别详解
- 队列的链接存储结构——链队列 图解和代码实现
- 匿名子类调用父类成员函数on_Previous();
- 数据库分区表
- IIS中播放rmvb文件和解决IIS中上传文件的最大值问题
- unity3d 画线(LineRenderer方式)
- 【黑马程序员】面向对象(三) 第七天
- 黑马程序员-学习日记23(java高新技术 3 )