Jasmin有能力指定常量池吗?我需要能够创建一个数千字节的描述符区域。该区域将包含任意字节数据,包括空值。下面是声明二进制常量的典型程序集指令的示例:
data 0x00, 0x01, 10, 32 ...
似乎 Java 类文件包含这些区域,但我在 Jasmin 中找不到在如此大规模上声明值的方法。
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 中定义一个并反编译生成的.class
文件。据我所知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 个值设置到新分配的数组中。