javap
,是Java class文件分解器,反编译class文件,也可以查看java编译器生成的字节码。主要用于分解class文件。学习这个工具之前可以先去简单了解一下class类文件结构 。
基本语法 命令格式:
1 javap [option] class文件(没有后缀名)
如果[option]为空,javap将输出传递给它的类的public域及方法,并输出到标准输出设备上(默认I/O为控制台)。如下代码,先javac编译源码,然后javap反编译class文件,注意不需要添加“.class”后缀。源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.xxo.demo.util;public class JavapDemo { private int num = 10 ; public static String name = "momo" ; public static void main (String[] args) { String a = name ; String b = "abc" ; String c = a+b ; System.out.println(c); } }
1 2 3 4 5 6 7 8 9 javap -help javap -l javap -public javap -protected javap -package javap -private javap -s 输出内部类型签名。 javap -c javap -verbose
javap -l 命令
public com.xxo.demo.util.JavapDemo(); 表示的默认的无参构造函数,
javap -pub|pro|pac|pri
就会显示出类中所用的public的类,构造方法,全局变量,局部变量就不会在此显示:
1 2 3 4 5 public class com.xxo.demo.util.JavapDemo extends java.lang.Object{//类信息 public static java.lang.String name;//public全部变量 public com.xxo.demo.util.JavapDemo();//默认的构造方法 public static void main(java.lang.String[]);//main方法 }
下面来修改一下源代码,
私有化一下默认构造方法,然后重写一下带参构造方法
定义一个protected的全局变量
private的HashMap类型的变量
修改后javac编译源码
源码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package com.xxo.demo.util;import java.util.HashMap;public class JavapDemo { private int num = 10 ; public static String name = "momo" ; protected Double height = 175.0 ; private HashMap map ; private JavapDemo () {} public JavapDemo (int num) { this .num = num; } public static void main (String[] args) { String a = name ; String b = "abc" ; String c = a+b ; System.out.println(c); } }
使用javap -protected
查看,显示protected和public类及成员:
使用javap -package
查看,会显示包、protected和public类及成员:
使用javap -private
查看,会显示所用成员:
javap -c 命令 javap -c #输出类中各方法的未解析的代码,即构成Java字节码的指令。我们这里还是使用上例中的源码,输入命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 Compiled from "JavapDemo.java" public class com .xxo .demo .util .JavapDemo extends java .lang .Object { public static java.lang.String name; protected java.lang.Double height; public com.xxo.demo.util.JavapDemo(int ); Code: 0 : aload_0 1 : invokespecial #1 ; 4 : aload_0 5 : bipush 10 7 : putfield #2 ; 10 : aload_0 11 : ldc2_w #3 ; 14 : invokestatic #5 ; 17 : putfield #6 ; 20 : aload_0 21 : iload_1 22 : putfield #2 ; 25 : return public static void main(java.lang.String[]); Code: 0 : getstatic #7 ; 3 : astore_1 4 : ldc #8 ; 6 : astore_2 7 : new #9 ; 10 : dup 11 : invokespecial #10 ; 14 : aload_1 15 : invokevirtual #11 ; 18 : aload_2 19 : invokevirtual #11 ; 22 : invokevirtual #12 ; 25 : astore_3 26 : getstatic #13 ; 29 : aload_3 30 : invokevirtual #14 ; 33 : return static {}; Code: 0 : ldc #15 ; 2 : putstatic #7 ; 5 : return }
javap -verbose 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 Compiled from "JavapDemo.java" public class com.xxo.demo.util.JavapDemo extends java.lang.Object SourceFile: "JavapDemo.java" minor version: 0 major version: 50 Constant pool: const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const { public static java.lang.String name; protected java.lang.Double height; public com/xxo.demo.util.JavapDemo(int); Code: Stack=3, Locals=2, Args_size=2 0: aload_0 1: invokespecial 4: aload_0 5: bipush 10 7: putfield 10: aload_0 11: ldc2_w 14: invokestatic 17: putfield 20: aload_0 21: iload_1 22: putfield 25: return LineNumberTable: line 16: 0 line 10: 4 line 12: 10 line 17: 20 line 18: 25 public static void main(java.lang.String[]); Code: Stack=2, Locals=4, Args_size=1 0: getstatic 3: astore_1 4: ldc 6: astore_2 7: new 10: dup 11: invokespecial 14: aload_1 15: invokevirtual 18: aload_2 19: invokevirtual 22: invokevirtual 25: astore_3 26: getstatic 29: aload_3 30: invokevirtual 33: return LineNumberTable: line 21: 0 line 22: 4 line 23: 7 line 24: 26 line 25: 33 static {}; Code: Stack=1, Locals=0, Args_size=0 // 0: ldc 2: putstatic 5: return LineNumberTable: line 11: 0 }
本篇博客就不一一讲解字节码指令的具体含义了,在后面的一篇博客”java-字节码 “,会详细的讲解字节码指令的具体含义。
上一篇:Java-字节码指令
下一篇:Java-类文件结构