学弟学妹们,如果你想吃透 Java字节码的话,看这篇就好了!(超级硬核,建议收藏

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

flags: (0x0021) ACC_PUBLIC, ACC_SUPER

this_class: #3 // com/itwanger/jvm/Main

super_class: #4 // java/lang/Object

interfaces: 0, fields: 1, methods: 2, attributes: 1

Constant pool:

#1 = Methodref #4.#18 // java/lang/Object.“”😦)V

#2 = Fieldref #3.#19 // com/itwanger/jvm/Main.age:I

#3 = Class #20 // com/itwanger/jvm/Main

#4 = Class #21 // java/lang/Object

#5 = Utf8 age

#6 = Utf8 I

#7 = Utf8

#8 = Utf8 ()V

#9 = Utf8 Code

#10 = Utf8 LineNumberTable

#11 = Utf8 LocalVariableTable

#12 = Utf8 this

#13 = Utf8 Lcom/itwanger/jvm/Main;

#14 = Utf8 getAge

#15 = Utf8 ()I

#16 = Utf8 SourceFile

#17 = Utf8 Main.java

#18 = NameAndType #7:#8 // “”😦)V

#19 = NameAndType #5:#6 // age:I

#20 = Utf8 com/itwanger/jvm/Main

#21 = Utf8 java/lang/Object

{

private int age;

descriptor: I

flags: (0x0002) ACC_PRIVATE

public com.itwanger.jvm.Main();

descriptor: ()V

flags: (0x0001) 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: bipush 18

7: putfield #2 // Field age:I

10: return

LineNumberTable:

line 6: 0

line 7: 4

LocalVariableTable:

Start Length Slot Name Signature

0 11 0 this Lcom/itwanger/jvm/Main;

public int getAge();

descriptor: ()I

flags: (0x0001) ACC_PUBLIC

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: getfield #2 // Field age:I

4: ireturn

LineNumberTable:

line 9: 0

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this Lcom/itwanger/jvm/Main;

}

SourceFile: “Main.java”

睁大眼睛瞧过去,感觉内容挺多的。同学们不要着急,我们来一行一行分析。

第 1 行:

Classfile /Users/maweiqing/Documents/GitHub/TechSisterLearnJava/codes/TechSister/target/classes/com/itwanger/jvm/Main.class

字节码文件的位置。

第 2 行:

Last modified 2021年4月15日; size 385 bytes

字节码文件的修改日期、文件大小。

第 3 行:

SHA-256 checksum 6688843e4f70ae8d83040dc7c8e2dd3694bf10ba7c518a6ea9b88b318a8967c

字节码文件的 SHA-256 值。

第 4 行:

Compiled from “Main.java”

说明该字节码文件编译自 Main.java 源文件。

第 5 行:

public class com.itwanger.jvm.Main

字节码文件的类全名。

第 6 行 minor version: 0,次版本号。

第 7 行 major version: 55,主版本号。

第 8 行:

flags: (0x0021) ACC_PUBLIC, ACC_SUPER

类访问标记,一共有 8 种。

表明当前类是 ACC_PUBLIC | ACC_SUPER。位运算符 | 的意思是如果相对应位是 0,则结果为 0,否则为 1,所以 0x0001 | 0x0020 的结果是 0x0021(需要转成二进制进行运算)。

第 9 行:

this_class: #3 // com/itwanger/jvm/Main

当前类的索引,指向常量池中下标为 3 的常量,可以看得出当前类是 Main 类。

第 10 行:

super_class: #4 // java/lang/Object

父类的索引,指向常量池中下标为 6 的常量,可以看得出当前类的父类是 Object 类。

第 11 行:

interfaces: 0, fields: 1, methods: 2, attributes: 1

当前类有 0 个接口,1 个字段(age),2 个方法(write()方法和缺省的默认构造方法),1 个属性(该类仅有的一个属性是 SourceFIle,包含了源码文件的信息)。

03、常量池

接下来是 Constant pool,也就是字节码文件最重要的常量池部分。可以把常量池理解为字节码文件中的资源仓库,主要存放两大类信息。

1)字面量(Literal),有点类似 Java 中的常量概念,比如文本字符串,final 常量等。

2)符号引用(Symbolic References),属于编译原理方面的概念,包括 3 种:

  • 类和接口的全限定名(Fully Qualified Name)

  • 字段的名称和描述符(Descriptor)

  • 方法的名称和描述符

Java 虚拟机是在加载字节码文件的时候才进行的动态链接,也就是说,字段和方法的符号引用只有经过运行期转换后才能获得真正的内存地址。当 Java 虚拟机运行时,需要从常量池获取对应的符号引用,然后在类创建或者运行时解析并翻译到具体的内存地址上。

当前字节码文件中一共有 21 个常量,它们之间是有链接的,逐个分析会比较乱,我们采用顺藤摸瓜的方式,从上依次往下看,那些被链接的常量我们就点到为止。

  • # 号后面跟的是索引,索引没有从 0 开始而是从 1 开始,是因为设计者考虑到,“如果要表达不引用任何一个常量的含义时,可以将索引值设为 0 来表示”(《深入理解 Java 虚拟机》描述的)。

  • = 号后面跟的是常量的类型,没有包含前缀 CONSTANT_ 和后缀 _info

  • 全文中提到的索引等同于下标,为了灵活描述,没有做统一。


第 1 个常量:

#1 = Methodref #4.#18 // java/lang/Object.“”😦)V

类型为 Methodref,表明是用来定义方法的,指向常量池中下标为 4 和 18 的常量。

第 4 个常量:

#4 = Class #21 // java/lang/Object

类型为 Class,表明是用来定义类(或者接口)的,指向常量池中下标为 21 的常量。

第 21 个常量:

#21 = Utf8 java/lang/Object

类型为 Utf8,UTF-8 编码的字符串,值为 java/lang/Object

第 18 个常量:

#18 = NameAndType #7:#8 // “”😦)V

类型为 NameAndType,表明是字段或者方法的部分符号引用,指向常量池中下标为 7 和 8 的常量。

第 7 个常量:

#7 = Utf8

类型为 Utf8,UTF-8 编码的字符串,值为 <init>,表明为构造方法。

第 8 个常量:

#8 = Utf8 ()V

类型为 Utf8,UTF-8 编码的字符串,值为 ()V,表明方法的返回值为 void。

到此为止,第 1 个常量算是摸完了。组合起来的意思就是,Main 类使用的是默认的构造方法,来源于 Object 类。


第 2 个常量:

#2 = Fieldref #3.#19 // com/itwanger/jvm/Main.age:I

类型为 Fieldref,表明是用来定义字段的,指向常量池中下标为 3 和 19 的常量。

第 3 个常量:

#3 = Class #20 // com/itwanger/jvm/Main

类型为 Class,表明是用来定义类(或者接口)的,指向常量池中下标为 20 的常量。

第 19 个常量:

#19 = NameAndType #5:#6 // age:I

类型为 NameAndType,表明是字段或者方法的部分符号引用,指向常量池中下标为 5 和 6 的常量。

第 5 个常量:

#5 = Utf8 age

类型为 Utf8,UTF-8 编码的字符串,值为 age,表明字段名为 age。

第 6 个常量:

#6 = Utf8 I

类型为 Utf8,UTF-8 编码的字符串,值为 I,表明字段的类型为 int。

关于字段类型的描述符映射表如下图所示。

到此为止,第 2 个常量算是摸完了。组合起来的意思就是,声明了一个类型为 int 的字段 age。

总结

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

下面有部分截图希望能对大家有所帮助。

在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
思就是,声明了一个类型为 int 的字段 age。

总结

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

下面有部分截图希望能对大家有所帮助。

[外链图片转存中…(img-lmAjZYWq-1713466036159)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-siqbcY6S-1713466036160)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值