本文主要是介绍获得java对象的内存地址,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,下面类提供了获取java对象内存地址的方法
package com.example.demo.othertest;
import java.lang.reflect.Field;
import sun.misc.Unsafe;public class Addresser {private static Unsafe unsafe;static {try {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);//arrayBaseOffset方法是一个本地方法,可以获取数组第一个元素的偏移地址int addressSize = unsafe.addressSize();long objectAddress;switch (addressSize) {case 4:objectAddress = unsafe.getInt(array, baseOffset);//getInt方法获取对象中offset偏移地址对应的int型field的值break;case 8:objectAddress = unsafe.getLong(array, baseOffset);//getLong方法获取对象中offset偏移地址对应的long型field的值break;default:throw new Error("unsupported address size: " + addressSize);}return (objectAddress);}public static void main(String... args) throws Exception {Object mine = "Hello world".toCharArray(); //先把字符串转化为数组对象long address = addressOf(mine);System.out.println("Addess: " + address);// Verify address works - should see the characters in the array in the outputprintBytes(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对象的内存地址的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!