00:00
关于常量池的解读啊,咱们就先告一段落了啊,这呢也是我们整个解读class文件结构中比较重的一块,包括呢,后续我们在字段表集合,方法表集合,包括属性表集合当中,咱们呢还会去调用常量池中的相关的一些索引结构啊,那我们的先常量池呢,就先说到这儿,那常量值之后啊,我们会看到一个结构呢,叫做访问标识,这个对应的英文呢,咱们翻译成叫access flag。嗯,中文呢,翻译过来,你叫访问标识也行,访问标记也可以,或者叫访问,呃标志或者叫访问标记都行,这个都可以啊,表达的是一个意思,我们在不同的书啊或者帖子当中啊,也看到,确实呢,这个写的名字呢,可能都不一致,这个没有关系啊,这个大家知道这个意思,就是个标记就行。那我们看下边这个说明,说呢,在这个常量值之后啊,紧跟着的呢,就是访问标记,这个高标记呢,使用两个字节来表示,就是我们所谓的U2。主要呢,是用来识别一些类或者接口层次的访问信息,就是我们当前这个资金码文件,你是一个类还是一个interface呢?你这个结构是不是一个public权限的呢?是不是这个抽象的权限,哎,抽象的一个声明呢,对吧,如果是一个类的话呢,这个类是不是一个final的呢?等等这呢都是对我们整体的这个结构进行的一个刻画。
01:20
对吧?哎,整体结构的一个括号,然后呢,这些修饰都有哪些结构呢?或者都有哪些这个具体修饰的这个结构呢?下边呢,我提供了这样的一个表格,提供了这样一个表格,大家呢,可以做个参照,整体上的话呢,就这些,那如果呢,我们看官方的文档的话呢,大家还是来看一下这个Oracle官方发的官发布的关于这个GVM的一个官方的一个规范,第四章主要是讲这个4G码文件结构的,这个大家往后找就行。往后看的话呢,我们专门有一项呢,叫做access flex是吧?诶就是我们这个叫访问标识,这个下边呢,这个表格就是用英文写的啊,这个信息呢,跟我这里边提供的这个呢,是完全一样子的,这个就相当于我自己又提供了一张表啊。
02:02
好,那么下边呢,其实我这里边儿的一些补充信息呢,也是来自于官方的这样的一个说明,只不过呢,我这里呢,做了一个翻译,好,那我们这里边来看一下,首先呢,我们来熟悉一下这个表格,这个表格呢,从上往下,我们看看修饰一个结构,它大概呢,都有哪些标识。比如说public,就是看你这个权限是不是一个public的,那好像除了public呢,大家发现也没有其他的权限了,因为这呢,咱们复习一个知识点,关于一个class也好,或者是一个接口也好,我们说它的这个权限修饰符呢,要么呢,是不是就是一个public的。表明呢,你就是一个公共的权限,要么的话呢,是不是就是一个默认权限呀,只有这两种情况,所以说呢,你要是有这个public声明呢,那就是public没有呢,那就是表明是一个默认权限,就是这个意思。下边呢是final,就是是不是一个用final修饰了super,这个呢,一会儿我们也会提到,就只要呢是一个类,这个类的话呢,都会自带这个super这样的一个访问标识,然后接口interface,如果呢,你要是个接口就需要呢用这个进行一个声明,包括你要是个注解的话呢,注解也需要来佩戴这样一个interface,下面呢叫abstract,就我们所谓的叫抽象。
03:11
嗯,如果你是个抽象类是吧,或者你是个接口,接口是不是也得是个抽象接口对吧,这样。这个呢叫呃sythetic啊,这个呢就是叫综合的啊或叫合成的啊,这呢就是下边提到了,我们可能会由编译器去产生一个类啊,这时候呢,会有这样个标识啊,An就是我们是一个注解是吧?那注解的话呢,会有这个标识啊,An就是表示你是个枚举类。好,那我们当前某一个结构呢,你看它是用哪一个去修饰的啊,就是表明这个结构呢,具有这样的一些特征,行,那回过来咱们看一下咱们当前这个DEMO。这个DEMO当中啊,两个字节,那么就是这两位吗?我们给它一个特殊的颜色啊,比如说就用这个颜色来表示。这样访问标识。OK,那这个访问标识呢,我们这看到呢是21,那回过来之后呢,咱们会去找这个表格,21发现呢,没有21这一项。
04:08
这个是正常的,这个21呢,其实是有我们这里边儿的一些项呢,做加法,然后合成的一个数值,那21我们看一下哪些数据呢,加起来能是21呢。这个21,注意我们这个21,咱们看到是不是是16进制啊,那这块呢,给的是不是也是16进制啊,咱就不用往这个呃十进制去转了,你直接呢做累加就行,那我们会发现呢,这个21实际上就等于我们这一项它是20,这一项呢是一,它俩合一起是不是就21呀。好,那么这个一呢,表明你是个public,就是说明我们这个权限呢,是一个public的,然后这个20呢,是一个修,我们刚才也提到过了,任何一个Java中的类。啊,任一个任何一个Java中的类呢,都会有这个标识,所以呢,这是一个默认的一个这个内容啊,默认的一个内容,那一共是21,那我们看一下当前咱们这个类,大家发现是不是确实是一个public类啊,这我们叫确认过眼神啊遇到了对的这个数据啊,Public没问题啊,这呢就是针对于咱们当前这个DEMO这个类的一个描述比较简单,那其他这个信息呢,我们整体来看一下。
05:14
啊,这里边儿有这个整体的说明,其实刚才呢,我也提到了一些了,这个嗯,咱们所有的这个标识的话呢,都是以ACC下划线开头的,嗯,这个大家稍微关注一下,行,嗯,然后呢,我们实际上的一个具体的类也好,接口也好,它是这些标识的一个并集,对吧?啊一个并集,如果呢,我们带有这叫interface的标识表示呢,我们当前就是一个类啊,反之的话呢,没有这个标识就是一个接口。我是不是说反了,有这个标识的话呢,表示你是个接口,不是类,如果没有这个标识呢,表示你是一个类,对吧。好,那如果说一个class文件呢,被设置成了叫interface,那么同时也应该设置它是abstract,那这个呢,就是注意一下,因为接口啊本身呢,它现在必须得被实现才行,它本身是不可以实例化的,对吧,它也有这样的一个标识,那有这个abstract的话呢,我们说就不能跟那个final啊这个去共用了,然后又因为你是个接口,你就不能是用我们这个super了,Super是类才会带这个标识,然后按那也不能使了,对吧,他们这都是不同的这个结构。
06:18
那如果要是没有设置这个interface呢,这个就表示呢,你是一个类结构是吧,那这里边又提到了一个叫tation,说ation,除了这个之外呢,都能用什么意思呢?就是如果我们一个结构呢,是annotation。只有下边你看这有写的话呢,我们说这就是一个注解,那注解的话呢,也需要有这样的一个标识。呃,就是也需要有这个interface这个标识,这个原因呢,是因为咱们在Java当中,比如说我这块呢,就给大家举一个例子啊,Surprise warmings是吧?嗯,这个接口的话呢,哎,不是这个接口,这个结构呢,是一个注解,那注解里边都带着这个叫interface,所以说如果你要是个注解的话呢,这个注解也需要有这个啊interface这样的标识。
07:01
好理解是吧,行,再往下看这个ACC呢,下划线修呢,我们说是针对于Java虚拟机指令集,这个编译器呢,只要是生成的这个自解码文件是个类的话呢,都会有这个标识,它是一个默认的存在啊,主要是为了相互兼容旧的Java编译器生成的代码和设计的啊,这个大家了解一下就行啊,这个散在这个呢,这块呢,主要是呃,表明我们当前你这个结构是编译器生成的,而不是我们由源代码呢给它来编译生成的。啊,就会有这样的一个标识啊,行A呢,表示你是个枚举类型啊,该类或者它的副类呢,是个枚举类型,好这样呢,就是我们关于这个访问标识这几项的一个描述,大家呢,针对于我们自己的这个类也好,接口也好,或者注解也好,媒体类也好,你看看呢,哎,它具有什么标识,来这个查看一下它这个具体的信息,那在咱们这个。嗯,Jackb当中这个信息呢,你注意你看没有在下边是吧,它这个信息呢,是在我们这叫general information,那在这个位置上。
08:00
它的这个access flex你看是21有个public,然后那个super呢,是一个默认有的对吧,或者你在我们的idea当中呢,这块也可以查看。那在上边这块,哎,这边是access flag啊在这来看,好这呢就是关于我们这叫访问标识的一个描述,比较简单。
我来说两句