JVM进阶之字节码文件解析指令
Posted ProChick
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM进阶之字节码文件解析指令相关的知识,希望对你有一定的参考价值。
1.javac指令
- 使用
javac
命令可以将源代码文件编译成字节码文件,然后就可以查看代码中的详细结构。 - 对于命令行的方式而言,我们可以使用
javac xx.java
或者javac -g xx.java
进行编译,只不过后者会比前者多生成局部变量表等信息,默认情况下Eclipse、IDEA等集成开发环境在编译时都采用的后者。
2.javap指令
- 通过对生成的字节码文件进行反编译,我们可以深入的了解Java代码的工作机制,Oracle官方也提供了工具这样的工具:
javap
。 - javap是JDK中自带的反编译工具,它的作用就是根据字节码文件反解析出当前类对应的Code区、局部变量表、异常表和代码行偏移量映射表、常量池等信息。
- 通过局部变量表,我们可以查看局部变量的作用域范围、所在槽位等信息,甚至可以看到槽位复用等信息。
常见命令操作示例
public class JavapTest {
private int num;
boolean flag;
protected char gender;
public String info;
public static final int COUNTS = 1;
static{
String url = "www.atguigu.com";
}
{
info = "java";
}
public JavapTest(){
}
private JavapTest(boolean flag){
this.flag = flag;
}
private void methodPrivate(){
}
int getNum(int i){
return num + i;
}
protected char showGender(){
return gender;
}
public void showInfo(){
int i = 10;
System.out.println(info + i);
}
}
-
javap -public JavapTest.class(仅显示public修饰的类和成员)
-
javap -protected JavapTest.class(仅显示public修饰、protected修饰的类和成员)
-
javap -private(-p) JavapTest.class(显示所有的类和成员)
-
javap -package JavapTest.class(显示非私有的所有类和成员)
-
javap -sysinfo JavapTest.class(显示正在处理的类的系统信息,比如:路径,大小,日期,源文件名等)
-
javap -constants JavapTest.class(显示非私有的所有类和成员,以及常量的值)
-
javap -s JavapTest.class(显示成员变量或方法返回值的类型信息)
-
javap -l JavapTest.class(显示行号表和局部变量表信息)
-
javap -c JavapTest.class(显示方法的字节码指令等详细信息)
-
javap -v JavapTest.class(显示常量池信息、行号表和局部变量表信息、方法的字节码指令信息等)
以上是关于JVM进阶之字节码文件解析指令的主要内容,如果未能解决你的问题,请参考以下文章