Java 如何在Jasmin中创建数据池?
Jasmin是否能够指定一个常量池?我需要能够创建一个数千字节的描述符区域。该区域将包含任意字节数据,包括空值。下面是一个用于声明二进制常量的典型汇编指令示例:Java 如何在Jasmin中创建数据池?,java,constants,pool,jasmin,Java,Constants,Pool,Jasmin,Jasmin是否能够指定一个常量池?我需要能够创建一个数千字节的描述符区域。该区域将包含任意字节数据,包括空值。下面是一个用于声明二进制常量的典型汇编指令示例: data 0x00, 0x01, 10, 32 ... Java类文件似乎包含这些区域,但我无法在Jasmin中找到一种方法来大规模声明这些值。Java类文件中的该区域称为常量池,详细描述见 但是,它不能包含任意非类型化数据,而是只包含类型化数据 支持的数据类型包括: CONSTANT\u Class CONSTANT\u Fie
data 0x00, 0x01, 10, 32 ...
Java类文件似乎包含这些区域,但我无法在Jasmin中找到一种方法来大规模声明这些值。Java类文件中的该区域称为常量池,详细描述见 但是,它不能包含任意非类型化数据,而是只包含类型化数据 支持的数据类型包括:
CONSTANT\u Class
CONSTANT\u Fieldref
CONSTANT\u Methodref
CONSTANT\u接口方法f
常量字符串
CONSTANT\u Integer
CONSTANT\u Float
CONSTANT\u Long
CONSTANT\u Double
常数\u名称和类型
常数\u Utf8
byte[]
是如何编码的最好方法是在Java中定义一个,并反编译生成的.class
文件。据我所知,byte[]
被编译成一个初始值设定块来设置它的字段
已确认:此Java类:
public class Test {
byte[] b = { 0, 1, 2, 3, 100 };
}
对此进行反编译(使用javac Test.java&&javap-v Test
):
从“Test.java”编译而来
公共类测试扩展了java.lang.Object
源文件:“Test.java”
次要版本:0
主要版本:50
固定池:
常数#1=方法#4.#13;//java/lang/Object。“:()V
常数#2=字段#3.#14;//测试b:[b]
常数#3=类#15;//测试
const#4=class#16;//java/lang/Object
常数#5=Asciz b;
常数#6=Asciz[B;
常数7=Asciz;
常数#8=Asciz()V;
常数#9=Asciz代码;
常数#10=Asciz LineNumberTable;
const#11=Asciz源文件;
const#12=Asciz Test.java;
const#13=名称和类型#7:#8;/“”:()V
const#14=name和type#5:#6;//b:[b
常数#15=Asciz试验;
const#16=Asciz java/lang/Object;
{
字节[]b;
公开考试();
代码:
堆栈=5,局部变量=1,参数大小=1
0:aload_0
1:invokespecial#1;//方法java/lang/Object。“:()V
4:aload_0
5:iconst_5
6:newarray字节
8:dup
9:iconst_0
10:iconst_0
11:巴斯托
12:dup
13:iconst_1
14:iconst_1
15:巴斯托
16:dup
17:iconst_2
18:iconst_2
19:bastore
20:dup
21:iconst_3
22:iconst_3
23:巴斯托
24:dup
25:iconst_4
26:bipush 100
28:巴斯托
29:putfield#2;//字段b:[b
32:返回
LineNumberTable:
第1行:0
第2行:4
}
如您所见,生成的构造函数“手动”将5个值设置到新分配的数组中。有趣的信息,但它没有解决这个问题。如何在Jasmin中实现这一点?因为Java
类
文件格式不支持存储任意字节[]
,它不能在Jasmin中完成。在Jasmin中唯一可以做的事情就是:生成填充字节[]的代码
。好的,让我们简化请求。我如何在Jasmin中指定Asciz?我已经验证了我可以使用操作数至少为60000个带引号字符串的ldc操作码。我更喜欢在数据声明语句中这样做。这可能吗?@BSalita:检查Jasmin主页,看起来您无法定义常量池条目正确。您只能通过ldc
间接执行此操作(这将把它的参数放入常量池)。谢谢,我相信这也是答案。在《茉莉花》中似乎是一个严重的遗漏。虽然严重,但它只影响少数用户。ldc是一个不错的解决办法。谢谢你的所有后续工作。我会将你的回答标记为答案。
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
}