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

2020-04-03 13:29:41 +08:00
 Newyorkcity

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

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

举的例子的图片里说,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 去算数组中某个元素的内存地址,怎么可能算对呢?

谢谢

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

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

呢?

在一个类中如果有两个类型为 int[].class 的成员,那么会不会导致方法错误?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/658991

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX