2017-11-28 10 views
3

java.lang.reflect.Field#slotは、ソースファイル内でフィールドがどのように宣言された順序でシーケンス番号を保持していますか?
私はそのプライベートを知っているので、それを使うべきではありませんが、とにかくそれを使うべきではありません。java.lang.reflect.Field#slotとは何ですか?

答えて

2

Field.slot意味は実装定義です。 HotSpot JVMには、指定されたクラスのVMの内部フィールド配列へのインデックスが含まれています。 Fieldオブジェクトが作成されると、slotフィールドがJVMランタイム内に設定されます。reflection.cppを参照してください。

このインデックスは、Javaソースファイル内のフィールドの順序と必ずしも一致しません。これは、オブジェクトヘッダーからのフィールドのオフセットには関係しません。 slotの意味については、何も仮定しない方が良いです。重要な意味は、JVMがjava.lang.reflect.FieldオブジェクトをMetaspaceの内部フィールド表現にすばやくマップできるようにすることです。

1

フィールドはJVMによって割り当てられます(Javaコードでは設定できません)。クラス内のメソッド簡単なプログラムは、それについてあなたに少しを伝えることができます:

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 

だから、サブクラスのメソッドは、オブジェクトのものに続いて、最低のインデックスを持っているように見える、といくつかの指標であります(宣言されたクラスの中にあるかもしれませんが)一意ではありません。

だから私は何かの価値に頼りたくはありません。

関連する問題