javap
,全称java printer
,是JDK中的一个基础命令行工具,用于反编译一个或多个class文件。其输出取决于使用的选项。如果未使用任何选项,则javap
命令将打印具有包,protected和public权限的字段和方法,并将其输出打印到标准输出stdout
。
关于javap
的详细用法如下:
1 | 用法: javap <options> <classes> |
其中,常用的选项有
1 | -public |
以下面的程序为例,Main类包含了private、default(缺省)、protected和public四种访问权限的字段和方法。
1 | public class Main { |
编译Main.java,得到Main.class文件
1.javap
的默认选项为-package
,只输出具有包、protected和public的字段和方法。在命令行中使用javap
或者javap -package
查看Main.class,输出的内容如下:
1 | hgs:~ hegongshan$ javap Main.class |
2.使用javap -public
将只输出class文件中的public字段和方法。以Main.class为例,输出内容如下:
1 | hgs:~ hegongshan$ javap -public Main.class |
3.javap -protected
将输出类中的public和protected的字段和方法。以Main.class为例,输出内容如下:
1 | hgs:~ hegongshan$ javap -protected Main.class |
4.javap -p
或者javap -private
将输出类中的所有字段和方法。以Main.class为例,输出内容如下:
1 | hgs:~ hegongshan$ javap -p Main.class |
5.javap -c
将对class文件进行反编译。以Main.class为例,输出内容如下:
1 | hgs:~ hegongshan$ javap -c Main.class |
6.javap -s
将输出内部类型签名。以Main.class为例,输出内容如下:
1 | hgs:~ hegongshan$ javap -s Main.class |
上述输出内容中,对于字段,descriptor:
后的字符,表示字段的类型,对应关系如下:
1 | B : byte |
对于方法,descriptor:
后的字符(参数类型描述)返回值类型描述
,表示方法的参数类型及其返回值的类型。
1 | V : void,表示没有返回值 |