`
dicmo
  • 浏览: 68584 次
  • 性别: 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  
需要知道这些吗?

相关推荐

    javap---application--键盘钢琴

    标题“javap---application--键盘钢琴”所指的是一款用Java编程语言开发的应用程序,它模拟了一款键盘钢琴。在Java编程中,"Application"通常指的是具有图形用户界面(GUI)的桌面应用程序,而非Web应用或移动应用。...

    wtl_wtl-implementation_of_javap-master_C++_

    标题 "wtl_wtl-implementation_of_javap-master_C++_" 暗示这是一个C++项目,其目标是实现Java的`javap`工具的功能。`javap`是Java开发工具包(JDK)的一部分,它用于反汇编Java字节码,帮助开发者查看和理解类文件...

    javaclass和源码-deep-in-jvm:简单的借助jdk中的内置工具帮助我们对比Java源码和生成的字节码以及探究Class文件字节

    java class和源码 deep-in-jvm ...运行javap分析Class文件字节码 javap -verbose Main &gt; Main.bytecode 分析包含内部类的源码编译出的Class文件 javap -verbose 'Main$Box.class' &gt; 'Main$Box.bytecode'

    javap使用(1).docx

    通过 `javap`,开发者能够深入了解 Java 编译器是如何处理源代码并生成字节码的,这对于优化程序性能和理解 Java 虚拟机 (JVM) 的工作原理至关重要。 #### 二、基本概念 在深入了解 `javap` 的使用之前,我们首先...

    ExtendJ-Mapper:ExtendJ的扩展,可将字节码映射到源代码

    字节码到源代码映射器这是ExtendJ的扩展,它允许字节码到源代码的映射具有更好的粒度,这意味着可以找到生成特定字节码指令的Java代码的精确部分。如何使用ExtendJ 在主文件夹中,运行: ./gradlew --rerun-tasks...

    javap使用说明文档

    javap 使用说明文档 javap 是 JDK 中的一个命令行工具,主要用于对给定的 class 文件进行反编译,了解 Java 编译器内部的工作机制,并提高程序执行的效率。下面是 javap 的使用说明。 1. javap 的基本用法 javap ...

    javap-Tool:JAVA项目

    在`javap-Tool-master`这个压缩包中,很可能包含了一个关于如何使用`javap`工具的示例项目或教程。通过研究这个项目,你可以深入理解`javap`的用法,并学会如何在实际开发中运用它来提升你的编程技能。对于Java...

    使用类分解器Javap分析Java字节码

    `Javap`是Java开发工具包(JDK)中自带的一个命令行工具,专门用于分析Java字节码,帮助开发者理解类文件的内部结构。在这个话题中,我们将深入探讨如何使用`Javap`作为类分解器来解析和理解Java字节码。 首先,让...

    2021-2022年收藏的精品资料软件工程师Java字节码开发深入解析教程解释.docx

    本教程将探讨Java字节码的组织形式以及如何使用`javap`命令来查看和分析字节码。 1. **Java字节码的组织形式** - 类文件结构:每个Java类文件都以魔数`OxCAFEBABE`开头,用于识别文件格式。接着是小版本号和大版本...

    JAVA字节码JAVA字节码.doc

    javap 可以将类文件(.class)中的字节码反编译成 Java 源代码的形式,打印出类中的公共域、方法、构造函数和静态初始值。 javap 的用法语法为:javap &lt;选项&gt; &lt;类名&gt;,其中选项包括: * -b:向后兼容 JDK 1.1 中的...

    4.程显峰--Java字节码技术1

    以简单的`Add`类为例,我们看到`javap`命令用于反编译字节码。`add`方法的字节码非常直观,主要由`iload`(加载整数到堆栈)、`iadd`(执行加法操作)和`ireturn`(返回结果)指令组成。这显示了JVM如何通过字节码...

    Java Command

    例如:`javap -c HelloWorld` 显示HelloWorld类的字节码指令。 6. **jdb命令**: - Java调试器,用于调试Java程序。例如:`jdb MyProgram` 启动MyProgram并连接到调试器。 7. **jconsole命令**: - Java可视化...

    java2应用命令详解

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

    JVM 字节码从入门到精通

    因此,本文从最简单的Java程序——打印"Hello, World"开始,逐步介绍如何将Java源文件编译成字节码文件,以及字节码文件中所包含的一些基本信息。 首先,我们需要编写一个简单的Java程序(Hello.java),程序中包含...

    Java中的内部类

    是个很麻烦,很纠结的问题 内部类基本语法 内部类继承 子类与父类的内部类同名 匿名类 内部接口及接口中的内部类 内部类的类文件 为什么需要内部类--内部类用途

    java 2语言命令详解

    查看`HelloWorld.class`的字节码: ``` javap -c HelloWorld ``` 6. **jdb**:Java调试器 `jdb` 是Java的命令行调试器,它允许你在运行时检查和修改程序状态。例如,启动`HelloWorld`并设置断点: ``` jdb -...

    jdk 查看类和方法

    其次,JDK内置的`javap`命令用于反汇编Java字节码,从而查看类和方法的内部结构。例如,要查看`String`类的方法,可以运行: ```shell javap -public java.lang.String ``` 这会显示`String`类的所有公共方法,...

Global site tag (gtag.js) - Google Analytics