写在前面
由于javac和javap是两个相反的过程,所以放在一起做分析。
关于javac和javap如果想要做详细的了解,还是需要看Oracle官网的介绍。访问入口如下:
本文内容均为自己阅读文档后自己总结的,后续如果发现其他好玩的,会继续更新。
当然,如果其中有错误,还请指正。
1、javac 和 javap简介
-
javac:接收由Java语言规范(JLS)定义的源代码(.java后缀的源文件),并生成由Java虚拟机规范(JVMS)定义的字节码类文件(.class)。简单来说就是把java文件编译为.class文件
-
javap:它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。
2、 javac
javac的用法:javac [ options ] [ sourcefiles ] [ @files ]
其中
- option:命令行选项
- sourcefiles :一个或多个要编译的源文件(比如 JavacAndJavapTest.java.java)
- @files一个或多个对源文件进行列表的文件
- 在cmd中,执行
javac
或者javac -help
命令,系统会提示javac的所有用法(如下图)。
关于javac,由于现在开发人员工作基本依赖eclipse和IDEA,所以基本上用不到其相关的命令。所以本文只讲两种情况:
①直接使用javac命令
②使用javac -g命令
其他命令的适用方法详见:https://blog.csdn.net/hudashi/article/details/7058998
2.1 javac和javac -g命令的区别(含示例代码)
javac
生成的是部分信息(不包含本地变量表、局部变量信息、常量池中的部分信息),而javac - g
生成的是全量的信息。
- 示例:
首先新建一个类 JavacAndJavapTest.java,如下:
public class JavacAndJavapTest {
//全局变量
int i = 1;
public void getInt() {
//局部变量
int j = 2;
}
}
执行javac
编译得到.class文件,通过javap -v
反编译后如下:
C:\Users\wendy\Desktop>javap -v JavacAndJavapTest.class
Classfile /C:/Users/wendy/Desktop/JavacAndJavapTest.class
Last modified 2020-2-16; size 297 bytes
MD5 checksum 8525b021df894472b5b5861501aa55c7
Compiled from "JavacAndJavapTest.java"
public class JavacAndJavapTest
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #4.#14 // java/lang/Object."<init>":()V
#2 = Fieldref #3.#15 // JavacAndJavapTest.i:I
#3 = Class #16 // JavacAndJavapTest
#4 = Class #17 // java/lang/O