什么是 java.lang.reflect.Field#slot?

What is a java.lang.reflect.Field#slot?

java.lang.reflect.Field#slot 是否按照字段在源文件中声明的顺序保存序列号?
我知道它是私有的,我不应该使用它和其他东西,但无论如何......

该字段由 JVM 分配(我在 Java 代码中找不到任何设置)并且包含 class 中方法的某种索引。一个简单的程序可以告诉你一些关于它的信息:

package slot;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class SlotTester {

    public void method1() { 
    }

    public void method2() { 
    }

    public static void method3() {
    }

    public void method4() {
    }

    public static void main(String[] args) throws Exception {

        SlotTester s = new SlotTester();
        Method[] methods = s.getClass().getMethods();

        for (Method method : methods) {

            Field f = method.getClass().getDeclaredField("slot");
            f.setAccessible(true);
            Integer slot = (Integer) f.get(method);

            System.out.println(method.getName() + " " + slot);
        }
    }
}

显示:

main 1
method1 2
method2 3
method3 4
method4 5
wait 3
wait 4
wait 5
equals 6
toString 7
hashCode 8
getClass 9
notify 12
notifyAll 13

因此 subclass 中的方法似乎具有最低索引,其次是 Object 中的方法,并且一些索引不是唯一的(尽管它们可能在声明的 class 中)。

所以我不想依赖任何东西的价值。

Field.slot 含义是实现定义的。在 HotSpot JVM 中,它包含给定 class 的 VM 内部字段数组的索引。 slot 字段在创建 Field 对象时在 JVM 运行时内设置,请参阅 reflection.cpp

此索引不一定与 Java 源文件中字段的顺序匹配。它与对象头的字段偏移量无关。最好不要对 slot 的含义做任何假设。关键意思是让JVM可以快速将一个java.lang.reflect.Field对象映射到Metaspace中的内部Field表示。