了解常量池的javap输出

在非常简单的HelloWorld应用程序上运行javap时,我对常量池周围的输出有些困惑。

public class TestClass {

public static void main(String[] args) {

System.out.println("hello world");

}

}

// Header + consts 1..22 snipped

const #22 = String #23; // hello world

const #23 = Asciz hello world;

public static void main(java.lang.String[]);

Signature: ([Ljava/lang/String;)V

Code:

Stack=2, Locals=1, Args_size=1

0: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc #22; //String hello world

5: invokevirtual #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: return

// Debug info snipped

}

好的,因此在第3行上,我们通过#22看到将“ hello

world”常量推入堆栈,但是const#23似乎保留了实际值。我想我对#(数字)出现在打印输出的右侧时的含义有些困惑。

Oracle /

Sun的javap手册页还有很多不足之处。

回答:

你所有的classinterfacefield名称和string常量进入java的 。

根据VM规范(http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html):

constant_pool是一个结构表(第4.4节),表示各种字符串常量,类和接口名称,字段名称以及在ClassFile结构及其子结构中引用的其他常量。每个constant_pool表条目的格式由其第一个“标签”字节指示。constant_pool表的索引从1到constant_pool_count-1。

因此,就常量池而言,可以将以下内容视为:

const #22 = String      #23;    //  hello world

const #23 = Asciz hello world;

#22(索引22)处的String值是类型,其值为null终止的c字符串(Asciz)hello

world位于索引23。

以上是 了解常量池的javap输出 的全部内容, 来源链接: utcz.com/qa/400158.html

回到顶部