解析字节码的作用
- 通过反编译生成字节码文件,可以深入了解Java工作机制,但自己分析类文件结构太麻烦,除了第三方的jclasslib工具外,官方提供了javap
- javap是jdk自带的反解析工具,它的作用是根据class字节码文件,反解析出当前类对应的code区(字节码指令)、局部变量表、异常表、代码行偏移量映射表、常量池等信息
- 通过局部变量表,可以查看局部变量的作用域范围、所在槽位等信息,甚至可以看到槽位复用信息
java -g操作
- 解析字节码文件得到的信息中,有些信息(如局部变量表、指令和代码行偏移量映射表、常量池中方法的参数名称等)需要在使用javac编译成class文件时,指定参数才能输出
- 直接使用javac xx.java,不会生成对应局部变量表等信息,使用javac -g xx.java可以生成相关信息,如使用eclipse或IDEA,默认情况下,在编译时会帮你生成局部变量表,指令和代码偏移量映射表等信息
javap
- classes是要反编译的class文件
- 在命令行直接输入javap或javap -help可以看到javap的options有如下选项

C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -version JavapTest.class
1.8.0_131
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {
boolean flag;
protected char gender;
public java.lang.String info;
public static final int COUNTS;
public com.chapter09.JavapTest();
int getNum(int);
protected char showGender();
public void showInfo();
static {
};
}
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -public JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {
public java.lang.String info;
public static final int COUNTS;
public com.chapter09.JavapTest();
public void showInfo();
}
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -protected JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {
protected char gender;
public java.lang.String info;
public static final int COUNTS;
public com.chapter09.JavapTest();
protected char showGender();
public void showInfo();
}
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -private JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {
private int num;
boolean flag;
protected char gender;
public java.lang.String info;
public static final int COUNTS;
public com.chapter09.JavapTest();
private com.chapter09.JavapTest(boolean);
private void methodPrivate();
int getNum(int);
protected char showGender();
public void showInfo();
static {
};
}
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -package JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {
boolean flag;
protected char gender;
public java.lang.String info;
public static final int COUNTS;
public com.chapter09.JavapTest();
int getNum(int);
protected char showGender();
public void showInfo();
static {
};
}
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -sysinfo JavapTest.class
Classfile /C:/Users/Administrator/IdeaProjects/jvm/target/classes/com/chapter09/JavapTest.class
Last modified 2024-5-27; size 1348 bytes
MD5 checksum 85dc41e7e2e7128d8899b5d131d7975f
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {
boolean flag;
protected char gender;
public java.lang.String info;
public static final