クラスに追加した整数配列フィールドにアクセスするためにバイトコード計測を使用したいと思います。これを行うには、クラスファイルのフィールドのインデックスが必要ですが、私はそれを見つけることができません。代わりに、より詳細に説明するのバイトコードでの使用のためにJavassistを使用してクラスの宣言フィールドのインデックスを取得
(希望は、そのインデックスIは、ローカル変数テーブルから取得しまし宣言されたローカルの整数、である):
desired = Server.rand.nextInt(4);
私がやりたい:
desired = _MyField[Server.rand.nextInt(_MyField.length)];
あろうJASMで
:フィールドはJavassistのを使用して追加され
// field reference to later access an index in the array
aload <local variable index of "this"> (push reference of class)
getfield <fieldindex> (pop reference, push field reference to stack)
// rand is a public static field in class Server
getstatic java.util.Random com.wurmonline.server.Server.rand
// field reference to pass to arraylength and the Random.nextInt(int) call
aload <local variable index of "this">
getfield <fieldindex> (push reference of array)
arraylength (pop reference, push array.length value)
invokevirtual int java.util.Random.nextInt(int) (pop length for rng, push index)
iaload (pop index, push integer value from array index)
istore <index of local variable "desired"> (pop value, store in variable)
は、SBがStringBuilあるましたフィールド初期化子(例えば、 "新しいINT [] {N、N、N、N、N};"):
ctClass.addField(
new CtField(
HookManager.getInstance().getClassPool().get("[I"),
"_OtherServerMissions",
ctClass),
sb.toString());
DirtyJOE、Java8 /メジャークラスファイルのバージョン52で動作するバイトコード・エディタを使用してクラスファイルを見ると、フィールドのインデックス値が見つかりません。また、CtField、または該当するAttributeInfoを使用して検索することもできません。
for (CtField ctField : ctClass.getDeclaredFields())
ここで、フィールドインデックスを取得する場所が不思議に思えます。
私の説明がこの問題に精通している貧しい人々のために十分に明確であることを望みます。