2
Jasmin是否有能力指定一個常量池?我需要能夠創建一個數千字節的描述符區域。該區域將包含任意字節數據,包括空值。下面是一個典型的集指令的例子來聲明二進制常量:如何在Jasmin中創建數據池?
data 0x00, 0x01, 10, 32 ...
看來,Java類文件包含這些領域,但我無法找到茉莉的方式對如此大規模的申報值。
Jasmin是否有能力指定一個常量池?我需要能夠創建一個數千字節的描述符區域。該區域將包含任意字節數據,包括空值。下面是一個典型的集指令的例子來聲明二進制常量:如何在Jasmin中創建數據池?
data 0x00, 0x01, 10, 32 ...
看來,Java類文件包含這些領域,但我無法找到茉莉的方式對如此大規模的申報值。
Java類文件中的該區域稱爲常量池,在§4.4 of the JVM Spec中有詳細描述。
但它不能包含任意的非類型化數據,而是包含類型化數據只有。
支持的數據類型是:
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中定義一個並反編譯生成的.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個值到新分配數組。
有趣的信息,但它沒有解決這個問題。 Jasmin如何做到這一點? – BSalita 2011-05-04 16:35:43
由於Java'class'文件格式不支持存儲任意'byte []',所以它不能在Jasmin中完成**。在Jasmin中唯一可以做的事情是一樣的:生成填充字節[]的代碼。 – 2011-05-04 16:39:24
好的,讓我們簡化請求。我如何在Jasmin中指定Asciz?我已驗證我可以使用操作數至少爲60000字符的引號字符串的ldc操作碼。我寧願在數據聲明聲明中這樣做。那可能嗎? – BSalita 2011-05-04 18:35:43