Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Jasmin中创建数据池?_Java_Constants_Pool_Jasmin - Fatal编程技术网

Java 如何在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

Jasmin是否能够指定一个常量池?我需要能够创建一个数千字节的描述符区域。该区域将包含任意字节数据,包括空值。下面是一个用于声明二进制常量的典型汇编指令示例:

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
None这些类型支持任意长度的数据。最接近,但要求其内容为有效的UTF-8数据,且不允许0字节

找出
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


}