深入Java编程:Java的字节代码2011-09-04 comprg.com.cn Java程序员很少注意程序的编译结果。事实上,Java的字节代码向我们提供了 非常有价值的信息。特别是在调试排除Java性能问题时,编译结果让我们可以更 深入地理解如何提高程序执行的效率等问题。其实JDK使我们研究Java字节代码变 得非常容易。本文阐述怎样利用JDK中的工具查看解释Java字节代码,主要包含以 下方面的一些内容:l Java类分解器——javapl Java字节代码是怎样使程序 避免程序的内存错误l 怎样通过分析字节代码来提高程序的执行效率l 利用第三方工具反编译Java字节代码一、Java类分解器 ——javap大多数Java程序员知道他们的程序不是编译成本机 代码的。实际上,程序被编译成中间字节代码,由Java虚拟机来解释执行。然而 ,很少程序员注意一下字节代码,因为他们使用的工具不鼓励他们这样做。大多 数的Java调试工具不允许单步的字节代码调试。这些工具要么显示源代码,要么 什么都不显示。幸好JDK提供了Java类分解器javap,一个命令行工具。 javap对类名给定的文件(.class)提供的字节代码进行反编译,打印出这些类的 一个可读版本。在缺省情况下,javap打印出给定类内的公共域、方法、构造函数 ,以及静态初始值。1.javap的具体用法语法: javap <选项 > <类名>...其中选项包括:
| 参数 | 含义 |
| b | 向后兼容JDK 1.1中的 javap |
| c | 反编译代码,打印出每个给定类中方法的 Java虚拟机指令。使用该选项后,将对包括私有及受保护方法在内的所有方法进 行反编译 |
| classpath <pathlist> | 指明到哪里 查找用户的类文件。这个选项值覆盖了缺少路径以及由CLASSPATH环境变量定义的 路径。此处给出的路径是一个目录及zip文件有序列表,其元素在Unix中以 “:”,在Windows中以“;”分隔。要想在不覆盖缺省系统 类路径的情况下增加一些要查找的目录或zip文件,应使用CLASSPATH环境变量, 使用方法与编译器的-classpath相同。 |
| extdirs <dirs> | 覆盖安装扩展目录 |
| help | 显示帮助信息 |
| J<flag> | 将<flag>直接传递给运行系 统 |
| l | 在原来打印信息的基础上,增加行号和局部 变量表 |
| public | 只显示公共类及其成员 |
| protected | 显示受保护/公共类及其成员 |
| package | 显示包受保护/公共类及其成员(缺省) |
| private | 显示所有类及其成员 |
| s | 打印内部类型标记 |
| bootclasspath <pathlist> | 覆盖由引导类加 载器加载的类文件位置 |
| verbose | 打印堆栈大小,方 法的局部变量和参数的数目。若可验证,打印出错原因 |