Day346&347&348&349

Day346&347&348&349_第1张图片

高版本虚拟机,可以解释运行低版本字节码文件

Day346&347&348&349_第2张图片


[](()3、常量池:存放所有常量

Class文件是JVM的基石,常量池是Class文件的基石

Day346&347&348&349_第3张图片

[](()①常量池计数器

常量池计数器与常量池表数量的关系相差1

当常量池计数器为1时,常量池表中没有常量项

Day346&347&348&349_第4张图片

16(十六进制)===>22(十进制) = = =>代表有22-1个常量项

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eY8ijPEt-1627913746779)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210802212416879.png)]


[](()②常量池表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kyIwDukx-1627913746780)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210802210518689.png)]

Day346&347&348&349_第5张图片


字面量和符号引用:↓

Day346&347&348&349_第6张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xg8aT81c-1627913746784)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210802210944345.png)]

Day346&347&348&349_第7张图片

Day346&347&348&349_第8张图片


常量类型和结构:↓

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJu2SU3m-1627913746787)(C:/Users/PePe/AppData/Local/Temp/mindmaster/1239293b2189/bin/0C0F81E0-9695-4BBC-837D-169D82EE03F8.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0iiVjIx7-1627913746789)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210802214138297.png)]

Day346&347&348&349_第9张图片

Day346&347&348&349_第10张图片

Day346&347&348&349_第11张图片


Day346&347&348&349_第12张图片

Day346&347&348&349_第13张图片

Day346&347&348&349_第14张图片

Day346&347&348&349_第15张图片

在class字节码文件中所表示的是指向某索引的符号有引用,不代表真正的内存地址

当被类加载器加载到内存中,所存放到运行时数据区中,此时的符号引用就编译成了真正指向真实内存地址的直接引用


[](()4、访问标识

Day346&347&348&349_第16张图片

Day346&347&348&349_第17张图片

Day346&347&348&349_第18张图片


[](()5、类索引、父类索引、接口索引集合

当前类叫什么、当前类的父类谁、当前类实现了几个接口

Day346&347&348&349_第19张图片

Day346&347&348&349_第20张图片

Day346&347&348&349_第21张图片


[](()6、字段表集合

平时我们说的类中的属性

Day346&347&348&349_第22张图片

[](()①字段计数器

Day346&347&348&349_第23张图片


[](()②字段表

字段(类成员变量)的描述符为:参数类型

Day346&347&348&349_第24张图片

Day346&347&348&349_第25张图片

Day346&347&348&349_第26张图片


Day346&347&348&349_第27张图片

Day346&347&348&349_第28张图片

Day346&347&348&349_第29张图片


[](()7、方法表集合

Day346&347&348&349_第30张图片


[](()①方法计数器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-angnJu3x-1628002213651)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210803213741918.png)]

Day346&347&348&349_第31张图片


[](()②方法表

方法的描述符为:方法的入参列表、方法的返回值类型

Day346&347&348&349_第32张图片

Day346&347&348&349_第33张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PFBbuXgU-1652250080401)(https://img-blog.csdnimg.cn 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 /5f0da650dec4438ca04c588190795ca6.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjg0NDY5,size_16,color_FFFFFF,t_70)]


[](()8、属性表集合

方法中可以有属性,字段中也可以有属性

Day346&347&348&349_第34张图片

[](()①属性计数器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-57W6gXwJ-1628002213659)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210803213833046.png)]


[](()②属性表

Day346&347&348&349_第35张图片

Day346&347&348&349_第36张图片

Day346&347&348&349_第37张图片

Day346&347&348&349_第38张图片

Day346&347&348&349_第39张图片

Day346&347&348&349_第40张图片

Day346&347&348&349_第41张图片

Day346&347&348&349_第42张图片

Day346&347&348&349_第43张图片

Day346&347&348&349_第44张图片

Day346&347&348&349_第45张图片


[](()9、总结

Day346&347&348&349_第46张图片


[](()四、使用javap指令解析Class文件


Day346&347&348&349_第47张图片

[](()1、解析字节码的作用

Day346&347&348&349_第48张图片


[](()2、javac -g操作

Day346&347&348&349_第49张图片


[](()3、javap的用法

Day346&347&348&349_第50张图片

Day346&347&348&349_第51张图片

最全信息的写法javap -v -p XXX.class


[](()4、使用举例

  • 代码

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 falg) {

this.flag = flag;

}

private void methodPrivate() {

}

int getNum(int i) {

return num + i;

}

protected char showGender() {

return gender;

}

public void showInfo() {

int i = 100;

System.out.println(info + i);

}

}

  • javap字节码文件分析

javap -v -p JavapTest.class

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

Last modified 2021-2-24; size 1393 bytes // 最后修改时间,字节码文件的大小

MD5 checksum 2c764244fa3a95bfb346c9e416a7a3f6 // MD5散列值

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

public class io.renren.JavapTest

minor version: 0 // 副版本

major version: 52 // 主版本

flags: ACC_PUBLIC, ACC_SUPER // 访问标识

//*************************** 常量池↓********************************

Constant pool:

#1 = Methodref #16.#48 // java/lang/Object.“”)V

#2 = String #49 // java

#3 = Fieldref #15.#50 // io/renren/JavapTest.info:Ljava/lang/String;

#4 = Fieldref #15.#51 // io/renren/JavapTest.flag:Z

#5 = Fieldref #15.#52 // io/renren/JavapTest.num:I

#6 = Fieldref #15.#53 // io/renren/JavapTest.gender:C

#7 = Fieldref #54.#55 // java/lang/System.out:Ljava/io/PrintStream;

#8 = Class #56 // java/lang/StringBuilder

#9 = Methodref #8.#48 // java/lang/StringBuilder.“”)V

#10 = Methodref #8.#57 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

#11 = Methodref #8.#58 // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;

#12 = Methodref #8.#59 // java/lang/StringBuilder.toString:()Ljava/lang/String;

#13 = Methodref #60.#61 // java/io/PrintStream.println:(Ljava/lang/String;)V

#14 = String #62 // www.atguigu.com

#15 = Class #63 // io/renren/JavapTest

#16 = Class #64 // 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 Lio/renren/JavapTest;

#35 = Utf8 (Z)V

#36 = Utf8 falg

#37 = Utf8 MethodParameters

#38 = Utf8 methodPrivate

#39 = Utf8 getNum

#40 = Utf8 (I)I

#41 = Utf8 i

#42 = Utf8 showGender

#43 = Utf8 ()C

#44 = Utf8 showInfo

#45 = Utf8

#46 = Utf8 SourceFile

#47 = Utf8 JavapTest.java

#48 = NameAndType #28:#29 // “”)V

#49 = Utf8 java

#50 = NameAndType #23:#24 // info:Ljava/lang/String;

#51 = NameAndType #19:#20 // flag:Z

#52 = NameAndType #17:#18 // num:I

#53 = NameAndType #21:#22 // gender:C

#54 = Class #65 // java/lang/System

#55 = NameAndType #66:#67 // out:Ljava/io/PrintStream;

#56 = Utf8 java/lang/StringBuilder

#57 = NameAndType #68:#69 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

#58 = NameAndType #68:#70 // append:(I)Ljava/lang/StringBuilder;

#59 = NameAndType #71:#72 // toString:()Ljava/lang/String;

#60 = Class #73 // java/io/PrintStream

#61 = NameAndType #74:#75 // println:(Ljava/lang/String;)V

#62 = Utf8 www.atguigu.com

#63 = Utf8 io/renren/JavapTest

#64 = Utf8 java/lang/Object

#65 = Utf8 java/lang/System

#66 = Utf8 out

#67 = Utf8 Ljava/io/PrintStream;

#68 = Utf8 append

#69 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;

#70 = Utf8 (I)Ljava/lang/StringBuilder;

#71 = Utf8 toString

#72 = Utf8 ()Ljava/lang/String;

#73 = Utf8 java/io/PrintStream

#74 = Utf8 println

#75 = 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;
va/io/PrintStream;

#68 = Utf8 append

#69 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;

#70 = Utf8 (I)Ljava/lang/StringBuilder;

#71 = Utf8 toString

#72 = Utf8 ()Ljava/lang/String;

#73 = Utf8 java/io/PrintStream

#74 = Utf8 println

#75 = 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;

你可能感兴趣的:(Java,经验分享,架构,java)