什么是 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表示。
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表示。