`
dicmo
  • 浏览: 69261 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

HelloWorld的javap -verbose HelloWorld 字节码初探

    博客分类:
  • j2ee
阅读更多
基本的HelloWorld类:
public class HelloWorld{
	public static void main(String [] args){
		System.out.println("Hello World");
	}
}


C:\demo>javap -verbose HelloWorld

Compiled from "HelloWorld.java"
public class HelloWorld extends java.lang.Object
SourceFile: "HelloWorld.java"
  minor version: 0
  major version: 50
  Constant pool:   	
//常量池,里面的内容很重要。
//Method:方法
//Field:字段
//String:字符串
//Asciz:方法签名 <init>由jvm调用,其他是不能够去调用它的。
//NameAndType:变量名的类型
//Class:类

//我们看看invokespecial #1 这条语句
//#1是对应的一个方法(Method).
//其中右边 #6.#15 表示从常量池的#6(表示偏移量)跳到进入#15去。
//#6对应的是class 到#15对应的是 NameAndType:#7:#8。
//在看#7对应的是:Asciz  <init> ,#8对应的是()V 表示没有返回值(void),()表示方法没//有参数。所以invokespecial  #1指的是:调用一个Method java/lang/Object."<init>":()V

//常见JVM指令:
//invokespecial:表示调用超类构造方法,实例初始化方法,私有方法。
//invokevirtual:调用实例方法
//invokestatic:调用静态方法
//invokeinterface:调用接口方法
//new:创建一个对象,并将其引用值压入栈顶

const #1 = Method       #6.#15; //  java/lang/Object."<init>":()V
const #2 = Field        #16.#17;        //  java/lang/System.out:Ljava/io/Print
const #3 = String       #18;    //  Hello World
const #4 = Method       #19.#20;        //  java/io/PrintStream.println:(Ljava/V
const #5 = class        #21;    //  HelloWorld
const #6 = class        #22;    //  java/lang/Object
const #7 = Asciz        <init>;
const #8 = Asciz        ()V;
const #9 = Asciz        Code;
const #10 = Asciz       LineNumberTable;
const #11 = Asciz       main;
const #12 = Asciz       ([Ljava/lang/String;)V;
const #13 = Asciz       SourceFile;
const #14 = Asciz       HelloWorld.java;
const #15 = NameAndType #7:#8;//  "<init>":()V
const #16 = class       #23;    //  java/lang/System
const #17 = NameAndType #24:#25;//  out:Ljava/io/PrintStream;
const #18 = Asciz       Hello World;
const #19 = class       #26;    //  java/io/PrintStream
const #20 = NameAndType #27:#28;//  println:(Ljava/lang/String;)V
const #21 = Asciz       HelloWorld;
const #22 = Asciz       java/lang/Object;
const #23 = Asciz       java/lang/System;
const #24 = Asciz       out;
const #25 = Asciz       Ljava/io/PrintStream;;
const #26 = Asciz       java/io/PrintStream;
const #27 = Asciz       println;
const #28 = Asciz       (Ljava/lang/String;)V;



public HelloWorld();
//默认构造函数
//Locals表示方法内局部变量个数,该例中是1,有些人疑惑的是HelloWorld()中明明没有参数啊,应该是0。  
//当线程调用一个方法的时候,jvm会开辟一个帧出来,这个帧包括操作栈、局部变量列表、常量池的引用  
//非static方法,在调用的时候都会给方法默认加上一个当前对象(this)类型的参数,不需要在方法中定义,  
//这个时候局部变量列表中index为0的位置保存的是this,其他索引号按变量定义顺序累加  
//static方法不依赖对象,所以不用传this  
//Args_size表示参数个数,public HelloWorld();会传一个this进去,所以value是1  

Code:
   Stack=1, Locals=1, Args_size=1
   0:   aload_0
   1:  invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return
  LineNumberTable:
   line 1: 0


public static void main(java.lang.String[]);
  Code:
   Stack=2, Locals=1, Args_size=1
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #3; //String Hello World
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/St
   8:   return
  LineNumberTable:
   line 3: 0
   line 4: 8
}

如果加上下面的代码:
public static void print(){
		System.out.println("Hello World");
	}

会得到下面的指令代码:
public static void print();
  Code:
   Stack=2, Locals=0, Args_size=0
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #3; //String Hello World
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return
  LineNumberTable:
   line 3: 0
   line 4: 8


Locals=0, Args_size=0
5
0
分享到:
评论
2 楼 hufeng0901 2010-11-28  
很好!详细
1 楼 pop1030123 2010-11-24  
需要知道这些吗?

相关推荐

    java2应用命令详解

    javap -verbose HelloWorld.class ``` 这将显示 `HelloWorld.class` 文件的详细信息。 6. **jdb**:Java 调试器 `jdb` 是 Java 的命令行调试器,可以用来单步执行代码、设置断点、查看变量值等。例如: ``` ...

    JAVA命令大全(bin目录下命令描述)

    例如,`javac HelloWorld.java`会将`HelloWorld.java`源文件编译成可执行的`HelloWorld.class`。 3. **javaw.exe**: 与`java.exe`类似,但不显示控制台窗口。主要用于运行具有图形用户界面(GUI)的应用程序,...

    21天学通java 很好的入门教材,讲解开发环境

    - `javap`: 反编译.class文件以查看字节码。 - `jdb`: Java调试工具。 - `jps`: 查看正在运行的JVM进程。 - `keytool`: 用于管理密钥库文件。 - `jar`: 创建和管理JAR文件。 - `javadoc`: 生成API文档。 ####...

    21学通JAVA

    - `-target+版本`:指定生成的字节码版本。 2. **其他JDK命令**: - `native2ascii`:用于Unicode和ASCII之间的转换。 - `javap`:Java反编译工具。 - `jdb`:Java调试工具。 - `jps`:列出正在运行的Java进程...

    21天学通JAVA(高清版)

    2. **`javap`**:将`.class`文件反编译为Java字节码。 3. **`jdb`**:Java调试工具,可用于调试Java程序。 4. **`jps`**:列出正在运行的JVM进程的信息。 5. **`keytool`**:用于管理密钥库文件,常用于生成证书。 6...

    21天学通JAVA.pdf

    - **可移植性**:由于Java代码被编译成字节码而非特定平台的机器码,因此可以在不同的硬件和操作系统上运行。 #### 二、Java的不同版本及应用领域 Java根据用途不同,分为三种主要版本: 1. **Java SE (Standard ...

    21天学通JAVA(高清版).pdf

    - **`javap`**:反编译.class文件,查看字节码。 - **`jdb`**:Java调试工具。 - **`jps`**:列出所有正在运行的Java进程。 - **`keytool`**:管理和生成证书。 - **`jar`**:打包多个文件为一个JAR文件。 - *...

    帮助初学者学习java 21天学通java

    4. **测试JDK**:编写一个简单的Java程序,例如“Hello World”,并使用命令行工具编译和运行。 #### 四、JDK常用命令详解 - **javac**:Java编译器,用于将Java源代码编译成字节码(.class文件)。 - `-g`: 生成...

Global site tag (gtag.js) - Google Analytics