java $p_javap命令学习

76b2b122cf76

image.png

bogon:classes xixi$ javap -package com.xixi.chapter18.JavapTest

Compiled from "JavapTest.java"

public class com.xixi.chapter18.JavapTest {

boolean flag;

protected char gender;

public java.lang.String info;

public static final int COUNTS;

public com.xixi.chapter18.JavapTest();

int getNum(int);

protected char showGender();

public void showInfo();

static {};

}

注意,这里面没有非静态代码块只有静态代码块,为什么?

非静态代码块和构造器结合在一起放在中。

通过Javap命令看到一个Java类反汇编得到的Class文件版本号,常量池,访问标志,变量表,指令代码行号表等信息。不限时类索引,父类索引,接口索引集合,,等结构。

在javap中会显示为statc{}

在javap中会显示为类构造器

javap -v -p JavapTest.class结果说明:

Classfile /C:/Users/songhk/Desktop/2/JavapTest.class //字节码文件所属的路径

Last modified 2020-9-7; size 1358 bytes //最后修改时间,字节码文件的大小

MD5 checksum 526b4a845e4d98180438e4c5781b7e88 //MD5散列值

Compiled from "JavapTest.java" //源文件的名称

public class com.atguigu.java1.JavapTest

minor version: 0 //副版本

major version: 52 //主版本

flags: ACC_PUBLIC, ACC_SUPER //访问标识

Constant pool: //常量池

#1 = Methodref #16.#46 // java/lang/Object."":()V

#2 = String #47 // java

#3 = Fieldref #15.#48 // com/atguigu/java1/JavapTest.info:Ljava/lang/String;

#4 = Fieldref #15.#49 // com/atguigu/java1/JavapTest.flag:Z

#5 = Fieldref #15.#50 // com/atguigu/java1/JavapTest.num:I

#6 = Fieldref #15.#51 // com/atguigu/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."":()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 // com/atguigu/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

#29 = Utf8 ()V

#30 = Utf8 Code

#31 = Utf8 LineNumberTable

#32 = Utf8 LocalVariableTable

#33 = Utf8 this

#34 = Utf8 Lcom/atguigu/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

#44 = Utf8 SourceFile

#45 = Utf8 JavapTest.java

#46 = NameAndType #28:#29 // "":()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 com/atguigu/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

#######################################字段表集合的信息################################################

{

private int num; //字段名

descriptor: I //字段描述符:字段的类型

flags: ACC_PRIVATE //字段的访问标识

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 //常量字段的属性:ConstantValue

#######################################方法表集合的信息################################################

public com.atguigu.java1.JavapTest(); //构造器1的信息

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=2, locals=1, args_size=1

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: aload_0

5: ldc #2 // String java

7: putfield #3 // Field info:Ljava/lang/String;

10: return

LineNumberTable:

line 20: 0

line 18: 4

line 22: 10

LocalVariableTable:

Start Length Slot Name Signature

0 11 0 this Lcom/atguigu/java1/JavapTest;

private com.atguigu.java1.JavapTest(boolean); //构造器2的信息

descriptor: (Z)V

flags: ACC_PRIVATE

Code:

stack=2, locals=2, args_size=2

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: aload_0

5: ldc #2 // String java

7: putfield #3 // Field info:Ljava/lang/String;

10: aload_0

11: iload_1

12: putfield #4 // Field flag:Z

15: return

LineNumberTable:

line 23: 0

line 18: 4

line 24: 10

line 25: 15

LocalVariableTable:

Start Length Slot Name Signature

0 16 0 this Lcom/atguigu/java1/JavapTest;

0 16 1 flag Z

private void methodPrivate();

descriptor: ()V

flags: ACC_PRIVATE

Code:

stack=0, locals=1, args_size=1

0: return

LineNumberTable:

line 28: 0

LocalVariableTable:

Start Length Slot Name Signature

0 1 0 this Lcom/atguigu/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 30: 0

LocalVariableTable:

Start Length Slot Name Signature

0 7 0 this Lcom/atguigu/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 33: 0

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this Lcom/atguigu/java1/JavapTest;

public void showInfo();

descriptor: ()V //方法描述符:方法的形参列表 、 返回值类型

flags: ACC_PUBLIC //方法的访问标识

Code: //方法的Code属性

stack=3, locals=2, args_size=1 //stack:操作数栈的最大深度 locals:局部变量表的长度 args_size:方法接收参数的个数

//偏移量 操作码 操作数

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."":()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

//行号表:指名字节码指令的偏移量与java源程序中代码的行号的一一对应关系

LineNumberTable:

line 36: 0

line 37: 3

line 38: 30

//局部变量表:描述内部局部变量的相关信息

LocalVariableTable:

Start Length Slot Name Signature

0 31 0 this Lcom/atguigu/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 15: 0

line 16: 3

LocalVariableTable:

Start Length Slot Name Signature

}

SourceFile: "JavapTest.java" //附加属性:指名当前字节码文件对应的源程序文件名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值