深入Java对象的地址的使用分析

 更新时间:2013年05月04日 14:37:33   作者:  
本篇文章介绍了,Java对象的地址的使用分析。需要的朋友参考下

 在传统的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上。

复制代码 代码如下:

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);
 }
}

API介绍:
boolean compareAndSwapInt(Object obj,long fieldoffset, int expect, int update);
    修改 obj对象的(fieldoffset)Int 属性值,若属性值为expect,则修改为 update ,返回true,若属性值不为expect则不修改,返回false
boolean compareAndSwapObject(Object obj,long Fieldoffset, Object expect, Object update);
    修改 obj对象的(fieldoffset)属性值,若属性值为expect,则修改为 update ,返回true,若属性值不为expect则不修改,返回false
long objectFieldOffset (Field field);
    得到 filed在对象中的偏移
void park(boolean flag, long time);
    使当前线程等待
void unpark(Thread  thread)
    使当前线程停止等待
Object getObject(Object obj,long fieldoffset);
    得到 obj 的 偏移为fieldoffset 的属性
int getInt(Object obj,long fieldoffset);
    得到 obj 的 偏移为fieldoffset 的int属性

相关文章

  • Java实现滑块拼图验证码

    Java实现滑块拼图验证码

    这篇文章主要为大家详细介绍了Java实现滑块拼图验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java Ribbon负载均衡详细讲解

    Java Ribbon负载均衡详细讲解

    Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,这篇文章主要介绍了Ribbon负载均衡服务调用案例代码,需要的朋友可以参考下
    2023-01-01
  • Lucene fnm索引文件格式源码解析

    Lucene fnm索引文件格式源码解析

    这篇文章主要为大家介绍了Lucene fnm索引文件格式源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • spring cloud实现Eureka注册中心的HA的方法

    spring cloud实现Eureka注册中心的HA的方法

    本篇文章主要介绍了spring cloud实现Eureka注册中心的HA的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Spring MVC全局异常实例详解

    Spring MVC全局异常实例详解

    这篇文章主要给大家介绍了关于Spring MVC全局异常的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-02-02
  • java遍历http请求request的所有参数实现方法

    java遍历http请求request的所有参数实现方法

    下面小编就为大家带来一篇java遍历http请求request的所有参数实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • 浅谈java object对象在heap中的结构

    浅谈java object对象在heap中的结构

    本文主要介绍了浅谈java object对象在heap中的结构,感兴趣的同学,可以参考下。
    2021-06-06
  • java序列化对象根据不同配置动态改变属性名的方法

    java序列化对象根据不同配置动态改变属性名的方法

    本文主要介绍了java序列化对象根据不同配置动态改变属性名的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Java如何做带复选框的菜单实例代码

    Java如何做带复选框的菜单实例代码

    大家好,本篇文章主要讲的是Java如何做带复选框的菜单实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • mybatis输出SQL格式化方式

    mybatis输出SQL格式化方式

    这篇文章主要介绍了mybatis输出SQL格式化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论