如何获得java对象的内存地址

Python020

如何获得java对象的内存地址,第1张

在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,如下代码示例:

package com.bijian.study

import java.lang.reflect.Field

import sun.misc.Unsafe

public class Addresser {

//实例化Unsafe 类

private static Unsafe unsafe

static {

try {

//得到field对象

Field field = Unsafe.class.getDeclaredField("theUnsafe")

//设置获取地址

field.setAccessible(true)

unsafe = (Unsafe) field.get(null)

} catch (Exception e) {

e.printStackTrace()

}

}

public static long addressOf(Object o) throws Exception {

Object[] array = new Object[] { o }

long baseOffset = unsafe.arrayBaseOffset(Object[].class)

int addressSize = unsafe.addressSize()

long objectAddress

switch (addressSize) {

case 4:

objectAddress = unsafe.getInt(array, baseOffset)

break

case 8:

objectAddress = unsafe.getLong(array, baseOffset)

break

default:

throw new Error("unsupported address size: " + addressSize)

}

return (objectAddress)

}

//打印地址的长度

public static void main(String... args) throws Exception {

Object mine = "Hi there".toCharArray()

long address = addressOf(mine)

System.out.println("Addess: " + address)

// Verify address works - should see the characters in the array in the output

printBytes(address, 27)

}

//调用此方法得到地址

public static void printBytes(long objectAddress, int num) {

//循环打印得到的地址。

for (long i = 0 i < num i++) {

int cur = unsafe.getByte(objectAddress + i)

System.out.print((char) cur)

}

System.out.println()

}

}

运行结果:

 java中不建议直接获取字符串内存地址,因为java不像c语言,获取内存地址是C语言的强项,java的弱项。但是java内存地址还是有一个应用场景,就是判断两个字符串内存地址是否相等来判断是否是同一个对象,用双等号“==”来比较的。参考代码如下:

public class Test01 {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

String str1="abc"

String str2=new String("abc")

System.out.println(str1 == str2)//输出false

}

}

1、首先打开java构造方法代码。

2、接下来就可以获得网卡物理地址方法代码。

3、然后得到获得机器IP地址方法代码。

4、然后得到获得机器子网掩码方法代码。

5、然后得到获得机器默认网关方法代码。

6、然后得到获得DNS方法代码。

7、最后得到主函数测试方法代码。

扩展资料

当使用80386时,必须区分以下三种不同的地址:

逻辑地址:机器语言指令仍用这种地址指定一个操作数的地址或一条指令的地址。这种寻址方式在Intel的分段结构中表现得尤为具体,它使得MS-DOS或Windows程序员把程序分为若干段。每个逻辑地址都由一个段和偏移量组成。

线性地址:针对32位CPU,线性地址是一个32位的无符号整数,可以表达高达2³² (4GB)的地址。通常用16进制表示线性地址,其取值范围为0x00000000~0xffffffff。对64位CPU,线性地址是一个64位的无符号整数,可以表达高达2⁶⁴  。

物理地址:也就是内存单元的实际地址,用于芯片级内存单元寻址。物理地址也由32位无符号整数表示。

电脑的内存(尤其是指主存)是由许多“内存地址”所组成的,每个内存地址都有一个“物理地址”,能供CPU(或其他设备)访问。一般,只有如BIOS、操作系统及部分特定之公用软件(如内存测试软件)等系统软件;

能使用机器码的运算对象或寄存器对物理地址定址,指示CPU要求内存控制器之类的硬件设备,使用内存总线或系统总线,亦或分别之控制总线、地址总线及数据总线,运行该程序之命令。

内存控制器的总线是由数条并行的线路所组成的,每条线路表示一个比特。总线的宽度因此依电脑不同,决定了可定址之存储单位数量,以及每一单位内的比特数量。

计算机程序使用内存地址来运行机器码、存储及截取数据。大多数的应用程序无法得知实际的物理地址,而是使用电脑的内存管理单元及操作系统的内存映射,为“逻辑地址”或虚拟地址定址。

参考资料:百度百科-内存地址