麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

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

2019-11-26 16:08:14
字體:
來源:轉載
供稿:網友

 在傳統的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屬性

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人在线视频网 | 黄在线观看 | 免费在线观看成人av | 日韩深夜视频 | 黄色片免费看看 | 看毛片免费 | 成人三级免费电影 | 毛片免费观看完整版 | 一区二区三级视频 | 成人在线观看免费观看 | 黄色大片在线免费观看 | 久久久免费电影 | av电影在线观看网址 | 国产99视频在线观看 | 久久久成人精品视频 | 成人羞羞在线观看网站 | aaaaaaa毛片 | 欧美成年人在线视频 | 国产精品一区二区三区在线 | 精品一区二区三区中文字幕老牛 | av手机在线电影 | 日韩av片网站 | 在线a亚洲视频播放在线观看 | 精品黑人一区二区三区国语馆 | 成人444kkkk在线观看 | 国产精品一区二区手机在线观看 | 精品影视一区二区 | 日韩视频高清 | 免费人成在线播放 | 在线看免费的a | 久久精品79国产精品 | 天天看天天摸天天操 | 久久另类视频 | 日本在线视频二区 | 美女黄影院 | 欧产日产国产精品乱噜噜 | 国产精品久久久久国产精品三级 | 久久艹逼| 一级在线观看视频 | 7777奇米成人四色影视 | 国产精品久久久免费观看 |