ジャスミンでデータプールを作成する方法は?
質問
ジャスミンには一定のプールを指定する機能がありますか?数千バイトの記述領域を作成できる必要があります。領域には、nullを含む任意のバイトデータが含まれます。バイナリ定数を宣言する典型的なアセンブリ指令の例を次に示します。
data 0x00, 0x01, 10, 32 ...
Javaクラスファイルにはこれらの領域が含まれているようですが、ジャスミンではこのような大規模な値を宣言する方法を見つけることができません。
解決
Javaクラスファイルのその領域は定数プールと呼ばれ、で詳細に説明されています JVM仕様の§4.4.
ただし、任意の非タイプデータを含めることはできませんが、代わりに型付けされたデータが含まれています それだけ.
サポートされているデータ型は次のとおりです。
CONSTANT_Class
CONSTANT_Fieldref
CONSTANT_Methodref
CONSTANT_InterfaceMethodref
CONSTANT_String
CONSTANT_Integer
CONSTANT_Float
CONSTANT_Long
CONSTANT_Double
CONSTANT_NameAndType
CONSTANT_Utf8
なし これらのタイプのうち、任意をサポートしています byte
任意の長さのデータ。 CONSTANT_Utf8
最も近くになりますが、そのコンテンツは有効なUTF-8データである必要があり、0バイトを許可しません。
方法を知るための最良の方法 byte[]
エンコードされているのは、Javaで1つを定義し、結果を逆コンパイルすることです .class
ファイル。 私の知る限りでは a byte[]
フィールドを設定した初期イザーブロックにコンパイルされます。
確認:このJavaクラス:
public class Test {
byte[] b = { 0, 1, 2, 3, 100 };
}
これに逆コンパイルします(使用します javac Test.java && javap -v Test
):
Compiled from "Test.java"
public class Test extends java.lang.Object
SourceFile: "Test.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #4.#13; // java/lang/Object."<init>":()V
const #2 = Field #3.#14; // Test.b:[B
const #3 = class #15; // Test
const #4 = class #16; // java/lang/Object
const #5 = Asciz b;
const #6 = Asciz [B;
const #7 = Asciz <init>;
const #8 = Asciz ()V;
const #9 = Asciz Code;
const #10 = Asciz LineNumberTable;
const #11 = Asciz SourceFile;
const #12 = Asciz Test.java;
const #13 = NameAndType #7:#8;// "<init>":()V
const #14 = NameAndType #5:#6;// b:[B
const #15 = Asciz Test;
const #16 = Asciz java/lang/Object;
{
byte[] b;
public Test();
Code:
Stack=5, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_5
6: newarray byte
8: dup
9: iconst_0
10: iconst_0
11: bastore
12: dup
13: iconst_1
14: iconst_1
15: bastore
16: dup
17: iconst_2
18: iconst_2
19: bastore
20: dup
21: iconst_3
22: iconst_3
23: bastore
24: dup
25: iconst_4
26: bipush 100
28: bastore
29: putfield #2; //Field b:[B
32: return
LineNumberTable:
line 1: 0
line 2: 4
}
ご覧のとおり、生成されたコンストラクターは「手動で」5つの値を新しく割り当てられた配列に設定します。
所属していません StackOverflow