`
wang_2011_ying
  • 浏览: 149963 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

javap 工具的介绍

阅读更多
[size=medium]javap 是jdk 自带的一个工具,可以反编译,也可以查看java编辑器生成的字符码,是分析代码的一个好的工具。
要分解class文件,方法:javap [option] class(没有后缀)
option:
-help 帮助;
-l 输出行和变量的表,在这个步骤之前需要运行命令 javac -g class.java,得到javap -l calss 所需要的参数;详见javac-public 只输出public方法和域;
-protected 只输出public和protected类和成员;
-package 只输出包,public 和protected 类和成员,这是默认的;
-private 输出所有类和成员;
-s 输出内部类型签名;
-c 输出分解后的代码,例如,类中每一个方法内,包含java字符码的指令;
-verbose 输出栈大小,方法参数的个数;

例1:
public class JavapCTest{
	/**
	 * @param args
	 */
	public static void main(String[] args){
		int i = 2;
		int j = 3;
	}
}

执行javac.JavapCTest.java,配置好自己的环境,再执行javap -c JavapCTest,得到如下代码:
Code:
 [color=violet]  0:   iconst_2    //把2放到栈顶
   1:   istore_1    //把栈顶的值放到局部变量1中,即i中
   2:   iconst_3    //把3放到栈顶
   3:   istore_2    //把栈顶的值放到局部变量2中,即j中
   4:   return[/color]

对于int i = 2;首先它会在栈中创建一个变量为i的引用,然后查找有没有字面值为2的地址,没找到,就开辟一个存放2这么字面值的地址,然后将i指向2的地址。
例2:
public class Difficult {

 public static void main(String[] args)
  {
  int i=2;
  i=i++;
  int j=i++;
  System.out.println(i+":"+j);
  }
}

输出结果:
3:2
Code:
[color=violet]0: iconst_2 //将常数2压入栈中:2
1: istore_1 //将栈顶的元素pop出,存入局部变量索引为1的位置:(栈中元素为空)
2: iload_1 //将局部变量索引为1的int压入栈:2
3: iinc 1, 1 //将局部变量索引为1的值加1:2
6: istore_1 //pop栈顶元素,将其存储到局部变量索引为1的位置:(栈中元素为空)
7: iload_1 //将局部变量索引为1的int压入栈:2
8: iinc 1, 1 //将局部变量索引为1的值加1:2
11: istore_2 //pop栈顶元素,将其存入局部变量索引为2的位置:(栈中元素为空)
12: return //返回:(栈中元素为空)[/color]

例3:
public class ByteCodeDemo {
public static void main(String[] args) {
System.out.println("Hello world");
}
}

运行完javap命令,你会看到如下输出:
public class ByteCodeDemo extends java.lang.Object {
 public ByteCodeDemo();
 public static void main(java.lang.String[]);
}
Method ByteCodeDemo()
0 aload_0
1 invokespecial #1 <Method java.lang.Object()>
4 return
Method void main(java.lang.String[])
0 getstatic #2 <Field java.io.PrintStream out>
3 ldc #3 <String "Hello world">
5 invokevirtual #4 <Method void println(java.lang.String)>
8 return

在这短小的列表中你可以学到很多字节码知识,从main方法第一个指令开始
0 getstatic #2 ,开始的整数是方法中的指令的偏移值,因此第一个指令以0开始。紧随偏移量是指令的助记符(mnemonic)。在这个范例中,'getstatic' 指令将一个静态成员压入一个称为操作数堆栈的数据结构,后续的指令可以引用这个数据结构中的成员。getstatic 指令后是要压入的成员。在这个例子中,要压入的成员是"#2 " 。如果你直接检查字节码,你会看到成员信息没有直接嵌入指令而是像所有由java类使用的常量那样存储在一个共享池中。将成员信息存储在一个常量池中可以减小字节码指令的大小,因为指令只需要存储常量池中的一个索引而不是整个常量。在这个例子中,成员信息位于常量池中的#2处。常量池中的项目的顺序是和编译器相关的,因此在你的环境中看到的可能不是'#2' 。

分析完第一个指令后很容易猜到其它指令的意思。'ldc' (load constant) 指令将常量"Hello, World."压入操作数栈。'invokevirtual'指令调用println方法,它从操作数栈弹出它的两个参数。不要忘记一个像println 这样的实例方法有两个参数:上面的字符串,加上隐含的'this'引用。
[/size]
分享到:
评论

相关推荐

    javap使用说明文档

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

    javap2p聊天工具源码

    在“javap2p聊天工具源码”中,我们可以深入理解以下几个关键知识点: 1. **Java编程语言**:Java是用于开发此聊天工具的基础,它是一种跨平台、面向对象的编程语言,具有丰富的类库和强大的性能,适合构建复杂的...

    javap使用(1).docx

    ### javap 使用详解 #### 一、概述 `javap` 是 Java 开发工具包 (JDK) 中的一个重要工具,主要用于反编译 `.class` 文件中...希望本文介绍的内容能够帮助读者更好地利用 `javap` 来优化和调试自己的 Java 应用程序。

    Java的class文件结构介绍以及如何实现javap

    NULL 博文链接:https://bolinyang.iteye.com/blog/1830472

    HelloWorld的javap -verbose HelloWorld 字节码初探

    2. **javap工具的使用**:详细介绍如何使用`javap`命令,包括基础用法和`-verbose`等高级选项的含义与作用。 3. **JVM指令集**:讲解JVM指令集的主要指令,如ALOAD(加载本地变量)、ICONST(常量加载)、IRETURN...

    javap写的完整记事本

    这款记事本应用充分利用了Java的Swing库来构建用户界面,Swing是Java Standard Edition (Java SE)的一部分,提供了丰富的组件和图形用户界面(GUI)工具,使得开发者能够创建出美观且功能强大的应用程序。...

    Java运行原理 javap命令运行结果

    `javap`是Java开发工具包(JDK)的一部分,用于反汇编Java字节码。它可以显示已编译的Java类文件中的内容,包括类和接口的签名、字段、方法等。这对于理解Java字节码的工作方式非常有用。 #### 三、案例分析:Java...

    ndk开发实战javap签名篇

    javah是用于生成Java本地接口(JNI)头文件的一个工具,它可以帮助开发者将Java类声明转换成C/C++的头文件,而javap是Java的反汇编工具,可以用来输出Java类的可读形式。描述强调,如果无法获取到签名,就无法根据...

    javap-Tool:JAVA项目

    `javap`就是其中之一,它是Java开发工具包(JDK)中的一款命令行工具,用于反汇编Java字节码,帮助我们查看类文件的结构。 `javap`工具主要用于以下几个方面: 1. **查看类信息**:你可以通过`javap`来查看一个类...

    eclipse配置javap命令的方法

    本文将详细介绍如何在Eclipse中配置`javap`命令,以便在开发过程中方便地查看和理解Java字节码。 首先,`javap`命令的主要用途是对Java类文件进行反编译,它能够揭示Java虚拟机(JVM)如何处理我们的源代码。例如,当...

    JavaP2P技术内幕 part4

    总结而言,JavaP2P技术是构建现代分布式应用的重要工具。它不仅推动了文件共享、分布式计算和社交网络等领域的发展,还促进了网络技术的进步。随着技术的不断演进,JavaP2P的应用场景和解决方案也将变得更加多样化和...

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

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

    javap命令的使用技巧

    javap 命令是 JDK 自带的一个工具,它可以对代码反编译,也可以查看 Java 编译器生成的字节码,对代码的执行过程进行分析,了解 JVM 内部的工作。javap 命令可以将 class 文件反编译成易于阅读的格式,展示类的结构...

    sbt-javap:直接从SBT控制台运行Javap

    Java提供了javap工具来反汇编和检查Java字节码。 这使作者可以查看其代码如何在较低级别上运行,了解如何对高级Scala概念进行编码以及潜在地发现性能问题。 使用javap一个挑战是正确指定类路径。 由于SBT知道您项目...

    查看运行代码的汇编指令的工具

    在IT领域,编程语言是构建软件的...`javap`作为基础工具,配合其他高级分析工具,可以为开发者提供强大的洞察力,提升代码质量和效率。在实际工作中,适时运用这些工具和技术,可以有效地解决复杂问题并提高开发效率。

    wtl_wtl-implementation_of_javap-master_C++_

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

    javap2p基于jxta

    总之,JXTA为Java开发者提供了一个强大且灵活的工具集,用于构建分布式P2P系统。通过深入研究和实践“javap2p基于jxta”的示例项目,我们可以掌握P2P网络的基本原理,并具备开发复杂P2P应用的能力。

    JD-GUI,JDGUI,java反编译工具

    java反编译工具: JD-GUI JD-GUI 是一个用 C++ 开发的 Java 反编译工具,由 Pavel Kouznetsov开发,支持Windows、Linux和苹果Mac Os三个平台 Javap 问:javap是反编译,还是反汇编? 答:javap是JDK自带的反汇编器...

    javap写的一个动态日历

    `javap`在这里可能被误用,实际上`javap`是Java平台的标准工具,用于反汇编Java类文件,展示字节码和相关的元数据。在上下文中,可能是想指代使用Java编程的动态日历应用。 【描述】:“这是用java写的一个控制台...

    javap---application--键盘钢琴

    总体而言,这个Java应用程序“javap---application--键盘钢琴”是一个趣味性的项目,它利用Java的GUI库(如Swing或JavaFX)创建了一个简单的音乐工具,让用户可以尝试用键盘演奏音乐。尽管存在一些问题,但这样的...

Global site tag (gtag.js) - Google Analytics