一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
javac
javac -g生成的字节码里有局部变量表信息
javac 生成的字节码里没有局部变量表信息
测试
javac
javac ClassTest.java
出现报错:
ClassTest.java:22: 错误: 编码GBK的不可映射字符
// 鍏跺疄鏄疭tringBuilder鐨勬嫾鎺? 鐢熸垚鐨勬槸涓?涓柊鐨凷tring瀵硅薄
分析原因应该是源文件的编码格式是utf-8,而文件中也出现了中文字符,中文字符编译错误.
改为javac设置编码
javac -encoding UTF-8 ClassTest.java
javac -g
javac -g -encoding UTF-8 ClassTest.java
差异:
首先从文件大小上可以看出-g多了一部分的数据
使用javap -v命令将两个文件都反编译后使用Bcompare比对
javap -v ClassTest.class> 1.txt
javap -v 11\ClassTest.class > 2.txt
可以很明显的看到缺少的局部变量表的信息
作为了解使用
javap
javap是jdk提供的一个反编译class文件的命令行工具,可以将class文件反编译为源代码.
javap
简单描述下各个命令的含义(其实后面已经有了):
-help: 提供命令的帮助信息(直接输入命令==输入命令 -help)
-version: 显示当前的jdk版本(是当前运行javap命令的jdk,而不是编译class文件的jdk)
-v -verbose: 输出反编译的详细信息(包括局部变量表,行号表,汇编指令等信息) 一般情况下我们都使用此命令进行源代码的查看
-l: 输出class文件的行号表和局部变量表
-c: 输出代码的反汇编(-c + -l == -v)
-public/-protected/-private(-p): 显示class文件中对应修饰符的成员(方法/字段)
-package: 如果不加上面三个参数,默认就使用-package,显示protected和public的成员.
常用的指令组合:
反编译整个类包括私有成员:
javap -v -p xxx.class