精华内容
下载资源
问答
  • 获得java对象的内存地址

    千次阅读 2018-10-24 12:17:31
    Unsafe类提供了硬件级别的原子操作,在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,下面类提供了获取java对象内存地址的方法 package ...

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

     

    展开全文
  • 例如: Dog a=new Dog(); 引用变量a的作用是获得new Dog()所创建对象的位置或者说是地址
  • 如何获得java对象的内存地址

    万次阅读 2018-03-18 12:59:00
    在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,如下代码片段:Java代码 package com.bijian.study; import java.lang.reflect.Field; ...

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

    Java代码   收藏代码
    1. package com.bijian.study;  
    2.   
    3. import java.lang.reflect.Field;  
    4. import sun.misc.Unsafe;  
    5.   
    6. public class Addresser {  
    7.       
    8.     private static Unsafe unsafe;  
    9.   
    10.     static {  
    11.         try {  
    12.             Field field = Unsafe.class.getDeclaredField("theUnsafe");  
    13.             field.setAccessible(true);  
    14.             unsafe = (Unsafe) field.get(null);  
    15.         } catch (Exception e) {  
    16.             e.printStackTrace();  
    17.         }  
    18.     }  
    19.   
    20.     public static long addressOf(Object o) throws Exception {  
    21.           
    22.         Object[] array = new Object[] { o };  
    23.   
    24.         long baseOffset = unsafe.arrayBaseOffset(Object[].class);  
    25.         int addressSize = unsafe.addressSize();  
    26.         long objectAddress;  
    27.         switch (addressSize) {  
    28.         case 4:  
    29.             objectAddress = unsafe.getInt(array, baseOffset);  
    30.             break;  
    31.         case 8:  
    32.             objectAddress = unsafe.getLong(array, baseOffset);  
    33.             break;  
    34.         default:  
    35.             throw new Error("unsupported address size: " + addressSize);  
    36.         }  
    37.         return (objectAddress);  
    38.     }  
    39.   
    40.     public static void main(String... args) throws Exception {  
    41.         Object mine = "Hi there".toCharArray();  
    42.         long address = addressOf(mine);  
    43.         System.out.println("Addess: " + address);  
    44.   
    45.         // Verify address works - should see the characters in the array in the output  
    46.         printBytes(address, 27);  
    47.     }  
    48.   
    49.     public static void printBytes(long objectAddress, int num) {  
    50.         for (long i = 0; i < num; i++) {  
    51.             int cur = unsafe.getByte(objectAddress + i);  
    52.             System.out.print((char) cur);  
    53.         }  
    54.         System.out.println();  
    55.     }  
    56. }  

    运行结果:



    另一篇java对象内存地址的文章:Java直接内存读写


    展开全文
  • Java获取对象内存地址

    千次阅读 2020-10-09 21:50:38
    haseCode()方法获取并非对象内存地址 hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,获取对象散列的地址,并非实际内存地址。 java直接打印对象,结果是十六进制的散列地址值 public class Object...

    haseCode()方法获取并非对象内存地址

    hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,获取对象散列的地址,并非实际内存地址。

    java直接打印对象,结果是十六进制的散列地址值

    public class ObjectTest {
        public static void main(String[] args) {
            Object obj = new Object();
            System.out.println(obj);
            System.out.println(Integer.toHexString(obj.hashCode();
        }
    }
    

    在这里插入图片描述

    haseCode()方法无法证明两个对象是否为同一个对象

    public class ObjectTest {
        public static void main(String[] args) {
            String s1 = "hello";
            String s2 = new String("hello");
            System.out.println(s1.hashCode());
            System.out.println(s2.hashCode());
        }
    }
    

    打印的值都相等,无法区分两个不同的对象
    在这里插入图片描述

    Java 如何获取对象内存地址

    maven引入jol工具包

    <dependency>
        <groupId>org.openjdk.jol</groupId>
        <artifactId>jol-core</artifactId>
        <version>0.9</version>
    </dependency>
    

    示例代码

    public class ObjectTest {
        public static void main(String[] args) {
            String s1 = "hello";
            String s2 = new String("hello");
            System.out.println(s1==s2);
            System.out.println(s1.equals(s2));
            System.out.println("--获取内存地址--");
            System.out.println(VM.current().addressOf(s1));
            System.out.println(VM.current().addressOf(s2));
        }
    }
    

    在这里插入图片描述

    展开全文
  • java中如何获取对象的内存地址

    千次阅读 2019-08-01 10:59:02
    java中如何查看对象地址:使用System.identityHashCode(“对象”) 即可 eg: Integer i = new Integer(5); System.identityHashCode(i)

    java中如何查看对象地址:使用  System.identityHashCode(“对象”) 即可

    eg:

     Integer i = new Integer(5);
     System.identityHashCode(i)

     

     

    展开全文
  • 如何获取到Java对象地址

    万次阅读 多人点赞 2019-02-02 16:15:31
    final修饰实例时,表示该实例不可以被修改,但是具体是指实例的内存地址不可以被修改? 还是实例里的值不可以被修改?还是实例的内存地址和值都不可以被修改? 其实是蛮简单的一个问题,当fin...
  • C# 获取对象地址

    千次阅读 2018-02-08 10:39:03
    测试代码如下: public class RAM { public void Test() { try { int num_Size = 100000000; // 获取整型的地址 var addr = ...
  • Java中如何获取对象(引用)地址

    万次阅读 多人点赞 2017-10-31 00:42:02
    上周有同学问,对象的hashcode是否就是它的地址?如何获取Java中一个对象地址? 首先我们来看第一个问题——对象的hashcode是否是它的地址,这个问题的答案是这个取决于具体的实现,一般来说,它常常是对象的初始...
  • Java对象地址

    千次阅读 2012-09-25 17:23:46
    当你在论坛上讨论这一点,提出的第一个问题是为什么你需要知道Java对象地址? 它是一种有效的问题。 但以往,我们保留进行试验的权利。探索未知领域的问题并没有什么错。我想出了一个使用sun公司包的实验。Unsafe...
  • Java数组属于引用类型对象,以此为例说明地址引用和内容复制的区别 1.地址引用 为一个数组变量赋值另一个数组变量后,2个数组变量指向同一个内存地址,引用同一个数组对象,此时内存中并没有建立新的数组对象。 2....
  • string direct = "../Search/Quick_CompanyListPro.aspx?Keyword="+Server.UrlEncode(TextBox_Name.Text.Trim());//对查询字符串进行加密 ... //对查询字符串进行解密.//Request对象获得地址栏中加密的查询字符串s
  • 浏览器地址栏传递对象做参数

    千次阅读 2019-09-23 15:56:32
    浏览器地址栏传递对象做参数
  • map 存放 类对象的 引用地址

    千次阅读 2016-08-19 15:22:47
    map 对象的值 加深理解
  • java对象的内存地址与hashcode值关系

    千次阅读 2020-05-19 12:44:57
    Unsafe类提供了硬件级别的原子操作,在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,具体下看的代码 package com.test.democlass; import sun...
  • Java 打印一个对象却输出地址

    千次阅读 多人点赞 2019-03-20 15:32:15
    有时候使用System.out.println()方法输出一个类的对象得到的结果却是该对象地址:类名@12aa35151 这个结果是怎么来的呢? System.out的println()方法只能在控制台输出字符串,有时候比如自己写的person类实例...
  • int main() { Box a[3]= { Box(), Box(15,18,20), Box(16,20,26) ...说明:主函数定义对象数组a[3],并将对象数组a的首地址赋值给指针变量P,通过指针变量P的移动,让指针P分别指向a[0], a[1], a[2]的地址
  • python 获取某个对象的引用地址

    千次阅读 2019-04-12 17:56:10
    class Dog(object): pass dog = Dog() print(id(dog)) dog2 = Dog() print(id(dog2)) 效果 carbon.png
  • 使用sun.misc.Unsafe获取java对象地址

    千次阅读 2013-11-13 15:21:26
    当你在论坛上讨论这一点,提出的第一个问题是为什么你需要知道Java对象地址? 它是一种有效的问题。 但以往,我们保留进行试验的权利。探索未知领域的问题并没有什么错。我想出了一个使用sun公司包的实验。Unsafe...
  • C++中打印变量或对象地址

    万次阅读 2018-08-10 14:43:35
    C语言中,我们可以使用格式控制符%p来打印一个变量的地址,如下: int a = 0; char * p = "hello"; printf("变量a的地址: %p\n", &amp;a); // 输出变量a的地址 printf("字符串的地址...
  • 最近在看《深度探索C++对象模型》,里面提到
  • java中,所有的引用放在栈内存中,所有的值放在堆内存中,而堆又分好多块,new 对象必然开辟对空间,放在大众的堆空间中,这部分是内存独立的, 所以如果有字符串String s1=new String(123);那么如果有String s2=...
  • 在Java中,如果一个对象未重写toString()方法,那么它将会调用父类的toString(),如果父类也没有重写这个方法,那么就迭代往上调用,直到Object的toString()方法。 ps:八种基本数据类型没有toString()方法;只能使用...
  • 本文根据对象中虚指针、成员变量、成员函数在类对象中的相对位置,分析并给出虚指针、成员变量在类对象的偏移地址分布情况及相关源码。
  • 对象的声明与实例化过程类名 对象名 = new 类名() ;Person p ; // 先声明一个 Person 类的对象 p p = new Person() ; // 用 new 关键字实例化 Person 的对象 p** 这里分别做了两件事: 1、 声明指向”由类所创建的...
  • Java对象句柄(指针,引用地址)

    千次阅读 2016-11-16 15:13:40
    Java中的术语 : 对象句柄 ... 只是一个引用地址, 我们不能认为Java中没有指针,其实这就是一个指针, 我们每次操作对象就是根据句柄去找到对象操作对象的. 即使没有对象,我们也可以让句柄单独存在. 例如: 创建Strin
  • 【C++】类与对象(取地址操作符)

    千次阅读 2019-02-25 18:01:09
    2.取地址及const取地址操作符重载 1.1 const修饰类的成员函数 将const修饰的类成员函数称之为const成员函数,实际const修饰的是该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。 class...
  • C/C++编程:打印变量或对象地址

    千次阅读 2020-07-07 20:33:59
    C语言中,我们可以使用格式控制符%p来打印一个变量的地址,如下: int a = 0; char * p = "hello"; printf("变量a的地址: %p\n", &a); // 输出变量a的地址 printf("字符串的地址:%p\n", p); // 输出字符串的...
  • 获取该地址中所有的get请求的数据

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 908,789
精华内容 363,515
关键字:

对象的地址怎么获得