質問

ジャスミンには一定のプールを指定する機能がありますか?数千バイトの記述領域を作成できる必要があります。領域には、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つの値を新しく割り当てられた配列に設定します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top