java - 如何在 Jasmin 中创建数据池?

标签 java constants pool jasmin

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

data  0x00, 0x01, 10, 32 ...

似乎 Java 类文件包含这些区域,但我无法在 Jasmin 中找到一种方法来声明如此大规模的值。

最佳答案

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

None 这些类型均不支持任意长度的任意 byte 数据。 CONSTANT_Utf8最接近,但要求其内容是有效的 UTF-8 数据并且不允许 0 字节。

找出 byte[] 是如何编码的最好方法是在 Java 中定义一个并反编译生成的 .class 文件。 据我所知 byte[] 被编译为设置其字段的初始化程序 block 。

已确认:这个 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 个值设置到新分配的数组中。

关于java - 如何在 Jasmin 中创建数据池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5886059/

相关文章:

java - 如何为 Java Spring Boot 和 MySql 设置 Docker 容器

java - 使用 MyFaces Tomahawk + ​​JSF 2.0 上传文件

c - 在函数内使用 const 和 static const 的速度有区别吗?

c++ - 我必须初始化函数局部静态常量吗?

Java连接池实现

c++ - C++ 中的多线程池

java如何定义newFixedThreadPool的大小

java - 启动外部 Activity 以显示 map

java - 如何在Windows 7中以管理员身份复制

c - 在c中的snprintf中使用const char数组