V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

请教 Java 的 Unsafe.arrayBaseOffset :传一个数组类.class,就能知道调用它的类中这个数组的成员的内存地址? how?

  •  
  •   Newyorkcity · 2020-04-03 13:29:41 +08:00 · 686 次点击
    这是一个创建于 1706 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html

    搜索 arrayBaseOffset 可快速定位到举的例子

    img

    举的例子的图片里说,unsafe.arrayBaseOffset(int[].class) 能获取到数组首元素地址。。

    可首先,这个是静态的,final 的,不可能不同 AtomicIntegerArray 实例有着不同的地址,但不同 AtomicIntegerArray 的实例内的数组不是同一个吧?

    比如说

        public static void main(String[] args) {
            AtomicIntegerArray a = new AtomicIntegerArray();
            AtomicIntegerArray b = new AtomicIntegerArray();
        }
    

    a 和 b 内部真的用来存储数据的数组不能同一个,那么它们各自的数组的起始地址应该不一样。但由于 private static final int base = unsafe.arrayBaseOffset(int[].class);static final 的限定,base 不可能在 a 和 b 中不一样,那接着用 base 以及元素地址增量 scale 去算数组中某个元素的内存地址,怎么可能算对呢?

    谢谢

    1 条回复    2020-04-03 13:42:09 +08:00
    Newyorkcity
        1
    Newyorkcity  
    OP
       2020-04-03 13:42:09 +08:00
    那还有一种理解就是 unsafe.arrayBaseOffset(int[].class) 得到的是这个类中类型为 int[].class 的成员相对于对象起始地址的偏移值。。但如果是这样,为什么不使用

    U.objectFieldOffset(klass.getDeclaredField("array"));

    呢?

    在一个类中如果有两个类型为 int[].class 的成员,那么会不会导致方法错误?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3381 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 11:43 · PVG 19:43 · LAX 03:43 · JFK 06:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.