一 点睛
javap的用法格式
javap <option> <classes>
其中,classes 就是你要反编译的 class 文件。
在命令行中直接输入 javap 或 java -help ,就可以看到 javap 的 options 有如下选项:
E:\jvmp2\chapter01\java1>javap
用法: javap <options> <classes>
其中, 可能的选项包括:
-help --help -? 输出此用法消息
-version 版本信息
-v -verbose 输出附加信息
-l 输出行号和本地变量表
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-package 显示程序包/受保护的/公共类
和成员 (默认)
-p -private 显示所有类和成员
-c 对代码进行反汇编
-s 输出内部类型签名
-sysinfo 显示正在处理的类的
系统信息 (路径, 大小, 日期, MD5 散列)
-constants 显示最终常量
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置
整理一下
-help --help -? 输出此用法消息
-version 版本信息,其实是当前 javap 所在 jdk 的版本信息,不是 class 在哪个 jdk 下生成的
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-p -private 显示所有类和成员
-package 显示程序包/受保护的/公共类和成员 (默认)
-sysinfo 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列)
-constants 显示静态最终常量
-s 输出内部类型签名
-l 输出行号和本地变量表
-c 对代码进行反汇编
-v -verbose 输出附加信息
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置
一般常用的是 -v -l -c 三个选项
javap -l 会输出行号和本地变量表信息
javap -c 会对当前 class 字节码进行反编译生成汇编代码。
java -v classxx 除了包含 -c 内容外,还会输出行号,局部变量表信息、常量池灯信息。不包含私有信息。
java -v -p classxx 最全的,包括所有的。
二 实战
1 代码
package chapter01.java1;
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);
}
}
2 测试
C:\Users\chengqiuming\Desktop\2>javap -version JavapTest.class
1.8.0_251
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest {
boolean flag;
protected char gender;
public java.lang.String info;
public static final int COUNTS;
public chapter01.java1.JavapTest();
int getNum(int);
protected char showGender();
public void showInfo();
static {};
}
C:\Users\chengqiuming\Desktop\2>javap -version
1.8.0_251
C:\Users\chengqiuming\Desktop\2>javap -public JavapTest.class
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest {
public java.lang.String info;
public static final int COUNTS;
public chapter01.java1.JavapTest();
public void showInfo();
}
C:\Users\chengqiuming\Desktop\2>javap -protected JavapTest.class
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest {
protected char gender;
public java.lang.String info;
public static final int COUNTS;
public chapter01.java1.JavapTest();
protected char showGender();
public void showInfo();
}
C:\Users\chengqiuming\Desktop\2>javap -private JavapTest.class
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest {
private int num;
boolean flag;
protected char gender;
public java.lang.String info;
public static final int COUNTS;
public chapter01.java1.JavapTest();
private chapter01.java1.JavapTest(boolean);
private void methodPrivate();
int getNum(int);
protected char showGender();
public void showInfo();
static {};
}
C:\Users\chengqiuming\Desktop\2>javap -package JavapTest.class
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest {
boolean flag;
protected char gender;
public java.lang.String info;
public static final int COUNTS;
public chapter01.java1.JavapTest();
int getNum(int);
protected char showGender();
public void showInfo();
static {};
}
C:\Users\chengqiuming\Desktop\2>javap -sysinfo JavapTest.class
Classfile /C:/Users/chengqiuming/Desktop/2/JavapTest.class
Last modified 2021-8-5; size 1354 bytes
MD5 checksum 1e39e428fd4b2abbbf17f01ea9bd2655
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest {
boolean flag;
protected char gender;
public java.lang.String info;
public static final int COUNTS;
public chapter01.java1.JavapTest();
int getNum(int);
protected char showGender();
public void showInfo();
static {};
}
C:\Users\chengqiuming\Desktop\2>javap -constants JavapTest.class
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest {
boolean flag;
protected char gender;
public java.lang.String info;
public static final int COUNTS = 1;
public chapter01.java1.JavapTest();
int getNum(int);
protected char showGender();
public void showInfo();
static {};
}
C:\Users\chengqiuming\Desktop\2>javap -s JavapTest.class
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest {
boolean flag;
descriptor: Z
protected char gender;
descriptor: C
public java.lang.String info;
descriptor: Ljava/lang/String;
public static final int COUNTS;
descriptor: I
public chapter01.java1.JavapTest();
descriptor: ()V
int getNum(int);
descriptor: (I)I
protected char showGender();
descriptor: ()C
public void showInfo();
descriptor: ()V
static {};
descriptor: ()V
}
C:\Users\chengqiuming\Desktop\2>javap -s -p JavapTest.class
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest {
private int num;
descriptor: I
boolean flag;
descriptor: Z
protected char gender;
descriptor: C
public java.lang.String info;
descriptor: Ljava/lang/String;
public static final int COUNTS;
descriptor: I
public chapter01.java1.JavapTest();
descriptor: ()V
private chapter01.java1.JavapTest(boolean);
descriptor: (Z)V
private void methodPrivate();
descriptor: ()V
int getNum(int);
descriptor: (I)I
protected char showGender();
descriptor: ()C
public void showInfo();
descriptor: ()V
static {};
descriptor: ()V
}
C:\Users\chengqiuming\Desktop\2>javap -l JavapTest.class
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest {
boolean flag;
protected char gender;
public java.lang.String info;
public static final int COUNTS;
public chapter01.java1.JavapTest();
LineNumberTable:
line 19: 0
line 16: 4
line 21: 10
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 this Lchapter01/java1/JavapTest;
int getNum(int);
LineNumberTable:
line 32: 0
LocalVariableTable:
Start Length Slot Name Signature
0 7 0 this Lchapter01/java1/JavapTest;
0 7 1 i I
protected char showGender();
LineNumberTable:
line 36: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lchapter01/java1/JavapTest;
public void showInfo();
LineNumberTable:
line 40: 0
line 41: 3
line 42: 30
LocalVariableTable:
Start Length Slot Name Signature
0 31 0 this Lchapter01/java1/JavapTest;
3 28 1 i I
static {};
LineNumberTable:
line 12: 0
line 13: 3
LocalVariableTable:
Start Length Slot Name Signature
}
C:\Users\chengqiuming\Desktop\2>javap -c JavapTest.class
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest {
boolean flag;
protected char gender;
public java.lang.String info;
public static final int COUNTS;
public chapter01.java1.JavapTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: ldc #2 // String java
7: putfield #3 // Field info:Ljava/lang/String;
10: return
int getNum(int);
Code:
0: aload_0
1: getfield #5 // Field num:I
4: iload_1
5: iadd
6: ireturn
protected char showGender();
Code:
0: aload_0
1: getfield #6 // Field gender:C
4: ireturn
public void showInfo();
Code:
0: bipush 10
2: istore_1
3: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
6: new #8 // class java/lang/StringBuilder
9: dup
10: invokespecial #9 // Method java/lang/StringBuilder."<init>":()V
13: aload_0
14: getfield #3 // Field info:Ljava/lang/String;
17: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: iload_1
21: invokevirtual #11 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
24: invokevirtual #12 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
27: invokevirtual #13 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
30: return
static {};
Code:
0: ldc #14 // String www.atguigu.com
2: astore_0
3: return
}
C:\Users\chengqiuming\Desktop\2>javap -v JavapTest.class
Classfile /C:/Users/chengqiuming/Desktop/2/JavapTest.class
Last modified 2021-8-5; size 1354 bytes
MD5 checksum 1e39e428fd4b2abbbf17f01ea9bd2655
Compiled from "JavapTest.java"
public class chapter01.java1.JavapTest
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #16.#46 // java/lang/Object."<init>":()V
#2 = String #47 // java
#3 = Fieldref #15.#48 // chapter01/java1/JavapTest.info:Ljava/lang/String;
#4 = Fieldref #15.#49 // chapter01/java1/JavapTest.flag:Z
#5 = Fieldref #15.#50 // chapter01/java1/JavapTest.num:I
#6 = Fieldref #15.#51 // chapter01/java1/JavapTest.gender:C
#7 = Fieldref #52.#53 // java/lang/System.out:Ljava/io/PrintStream;
#8 = Class #54 // java/lang/StringBuilder
#9 = Methodref #8.#46 // java/lang/StringBuilder."<init>":()V
#10 = Methodref #8.#55 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#11 = Methodref #8.#56 // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
#12 = Methodref #8.#57 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#13 = Methodref #58.#59 // java/io/PrintStream.println:(Ljava/lang/String;)V
#14 = String #60 // www.atguigu.com
#15 = Class #61 // chapter01/java1/JavapTest
#16 = Class #62 // java/lang/Object
#17 = Utf8 num
#18 = Utf8 I
#19 = Utf8 flag
#20 = Utf8 Z
#21 = Utf8 gender
#22 = Utf8 C
#23 = Utf8 info
#24 = Utf8 Ljava/lang/String;
#25 = Utf8 COUNTS
#26 = Utf8 ConstantValue
#27 = Integer 1
#28 = Utf8 <init>
#29 = Utf8 ()V
#30 = Utf8 Code
#31 = Utf8 LineNumberTable
#32 = Utf8 LocalVariableTable
#33 = Utf8 this
#34 = Utf8 Lchapter01/java1/JavapTest;
#35 = Utf8 (Z)V
#36 = Utf8 methodPrivate
#37 = Utf8 getNum
#38 = Utf8 (I)I
#39 = Utf8 i
#40 = Utf8 showGender
#41 = Utf8 ()C
#42 = Utf8 showInfo
#43 = Utf8 <clinit>
#44 = Utf8 SourceFile
#45 = Utf8 JavapTest.java
#46 = NameAndType #28:#29 // "<init>":()V
#47 = Utf8 java
#48 = NameAndType #23:#24 // info:Ljava/lang/String;
#49 = NameAndType #19:#20 // flag:Z
#50 = NameAndType #17:#18 // num:I
#51 = NameAndType #21:#22 // gender:C
#52 = Class #63 // java/lang/System
#53 = NameAndType #64:#65 // out:Ljava/io/PrintStream;
#54 = Utf8 java/lang/StringBuilder
#55 = NameAndType #66:#67 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#56 = NameAndType #66:#68 // append:(I)Ljava/lang/StringBuilder;
#57 = NameAndType #69:#70 // toString:()Ljava/lang/String;
#58 = Class #71 // java/io/PrintStream
#59 = NameAndType #72:#73 // println:(Ljava/lang/String;)V
#60 = Utf8 www.atguigu.com
#61 = Utf8 chapter01/java1/JavapTest
#62 = Utf8 java/lang/Object
#63 = Utf8 java/lang/System
#64 = Utf8 out
#65 = Utf8 Ljava/io/PrintStream;
#66 = Utf8 append
#67 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#68 = Utf8 (I)Ljava/lang/StringBuilder;
#69 = Utf8 toString
#70 = Utf8 ()Ljava/lang/String;
#71 = Utf8 java/io/PrintStream
#72 = Utf8 println
#73 = Utf8 (Ljava/lang/String;)V
{
boolean flag;
descriptor: Z
flags:
protected char gender;
descriptor: C
flags: ACC_PROTECTED
public java.lang.String info;
descriptor: Ljava/lang/String;
flags: ACC_PUBLIC
public static final int COUNTS;
descriptor: I
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
ConstantValue: int 1
public chapter01.java1.JavapTest();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: ldc #2 // String java
7: putfield #3 // Field info:Ljava/lang/String;
10: return
LineNumberTable:
line 19: 0
line 16: 4
line 21: 10
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 this Lchapter01/java1/JavapTest;
int getNum(int);
descriptor: (I)I
flags:
Code:
stack=2, locals=2, args_size=2
0: aload_0
1: getfield #5 // Field num:I
4: iload_1
5: iadd
6: ireturn
LineNumberTable:
line 32: 0
LocalVariableTable:
Start Length Slot Name Signature
0 7 0 this Lchapter01/java1/JavapTest;
0 7 1 i I
protected char showGender();
descriptor: ()C
flags: ACC_PROTECTED
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: getfield #6 // Field gender:C
4: ireturn
LineNumberTable:
line 36: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lchapter01/java1/JavapTest;
public void showInfo();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=3, locals=2, args_size=1
0: bipush 10
2: istore_1
3: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
6: new #8 // class java/lang/StringBuilder
9: dup
10: invokespecial #9 // Method java/lang/StringBuilder."<init>":()V
13: aload_0
14: getfield #3 // Field info:Ljava/lang/String;
17: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: iload_1
21: invokevirtual #11 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
24: invokevirtual #12 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
27: invokevirtual #13 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
30: return
LineNumberTable:
line 40: 0
line 41: 3
line 42: 30
LocalVariableTable:
Start Length Slot Name Signature
0 31 0 this Lchapter01/java1/JavapTest;
3 28 1 i I
static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=1, locals=1, args_size=0
0: ldc #14 // String www.atguigu.com
2: astore_0
3: return
LineNumberTable:
line 12: 0
line 13: 3
LocalVariableTable:
Start Length Slot Name Signature
}
SourceFile: "JavapTest.java"