00:00
好,那下边咱们来看一下这个扎P具体的一个指令的一个使用啊,刚才呢,其实咱们用到了其中的一个指令叫做扎P-V对吧?那为什么我们使用杠V,除了杠V之外呢,还有哪些指令呢?那咱们下边呢,来做一个这个说明,好,咱们做个说明,OK,呃,这几个指令呢,咱们就把它就都关掉了啊,那关于这个JP的使用的话呢,我们说是这样子的,首先呢是JP,后边呢是这个options,也就是我们相对应的这个JP对应的一些这个参数,咱们刚才呢用了一个叫杠V,然后再往后的话呢,就是我们要解析的这个词,解码文件的这个名字,所以呢,主要就是这三部分构成的。行,那么如果我们具体想使用这个JP的话呢,我们可以使用它的一个这个这个也是一个参数啊叫help,那我们能看到呢,就到底扎P这个指令有哪些具体的options,这呢,就是我们把这个截图呢,给大家放到这一块,那我们自己来操作这块操作的话呢,咱们就使用一下,别看一了,一呢是不带这个局部编量表信息的,对吧?那我们就直接呢看这个二或者是三啊都可以啊,比如以这个二为例吧,在这个二当中呢,我们CMD一下。
01:05
打开以后这时候呢,大家在这个这个命令行这块,你直接输入一个P,那一回车呢,就能显示出来,我们叉P支持的这些options,包括它的用法,你看这块刚才也提到了,对吧,那你也可以呢,这P后边带一个这个help是一样子的啊,他们打印出来的信息呢,是完全相同的。嗯,这儿呢,就是我们支持的一些具体的options都有哪些,嗯,这块呢,对应的中文也给我们列出来了,行,那咱们这里边的话呢,这样来给大家做一个说明,那这里边儿这个顺序的话呢,我给大家重组了一下,便于呢咱们来讲解这个事儿,行,那重组以后呢,咱们这样子来说,首先呢,我这块截个图啊盯一下。诶把这块呢,我们定一下来进行一个说明,咱们针对呢,就是咱们刚才呢,是不是编译之后得到了一个叫做jap,呃,Jap test的点class文件,对吧?针对这个文件呢,咱们进行个说明好了,那下边咱们就开始,那开始之前呢,咱们稍微对这个类呢有一个熟悉,这里边这个类呢,我们叫JP test,我呢这块呢提前做了一个设置,尽量呢是我们这个信息呢丰富一些,大家来看一下我这个类里边都声明了哪些结构,首先的话呢,是一些field。
02:17
这个咱们现在呢,就翻译成叫字段了,翻译成属性呢就不合适了,对吧,翻译成字段这个有私有的默认权限的,Protect权限的,Public权限的一些字段,包括呢,还有一个static final这样的一个常量,下边呢,还有这个静态代码块,非静态代码块,包括构造器,构造器这块呢,我们也提供了两个不同权限的这个构造器。然后再下边的话呢,就是12344个方法,主要区别呢,就是他们的权限修饰符是不同的,就是这样的一个结构行,那针对这个结构呢,我们编译得到的这个自节码文件,下边呢,我们使用jap呢来进行一个分析,好分析的话呢,这刚才呢,已经说到了一个叫做杠help这个指令,对吧?然后下边那个呢,叫version来咱们操作一下。
03:05
扎P-version,然后后边呢,指明你这个存节码文件JP t.class对吧,一回车这时候呢,大家会看到叫1.8.0131。那这个1.8的具体的131这个版本,它指的是什么呢?这个就是当前扎P所在的JDK的一个版本信息,不是咱们class在哪个JDK下生成的。不是这个class在哪个JDK下生成的,也就是说其实我们现在呢,比如我写个JP-version,你看我没必要呢去写这个具体的资金码文件了,大家注意,你看我这时候回撤一下。你会发现呢,是不是照样能够显示出我们这个version啊,所以呢,不跟咱们具体这个classes呢去关联对吧,所以它列举出来就是你这个扎P指令,你这个指令呢,呃,所在的这个JDK这个版本是多少呢?那这块呢,就看到是131是吧,跟咱们具体的这个词件版文件,你是使用哪个版本进行的一个这个编译是吧?这块呢我们不关心啊,其实呢,跟你具体一个文件呢没有关系啊,这是我们说的这个信息,好在接下来的话呢,下边这些绿色的指令就跟咱们这个具体的自解码文件呢就有关系了。
04:16
那咱们来看一看啊,首先这个叫杠public,说呢仅显示公共的类核成员,那来吧,P-public后边呢,带上我们扎p test夹子解码文件。就这样子呗,对吧,一回车。好这些大家呢,你看一下把我们生成的这个。那你看这还告诉我们这个,嗯,自解码文件呢,是从我们javap test.java这个文件里边呢,这个解析到的,就是相当于知道这个原文件啊,然后接下来的话呢,关于这个类呢,里边包含的信息,大家会看到公共的一个属性,还有我们这个全局常量,还包括公共的构造器,还有公共的一个方法,这些结构呢,是不是仅仅是咱们刚才这个扎P这个类当中公共的这些信息啊。
05:01
两个,然后这有一个三个,然后下边这个四个对吧,那对应过来呢,就是我们这里边儿的这四个只显示公共的信息,好这就是public的意思比较简单对吧,然后对应的这个杠protected的话呢,其实一样。这个大家呢清楚,干public能你就干protecting呢,也自然而然的就会比较清楚。Protected,然后P点。Class。回撤一下,那这时候大家会发现帮我们生成的这个结构当中啊,此时呢,就包含了这个叫protected这个权限相关的一些结构,比如说gender呢,是protected这样的一个字段就有了,然后下边呢,还有这个protected的一个方法也有了。构造器,咱没有设置这样的这个权限构造器,所以这个看不出来了,对吧,那那你也知道,如果要有的话呢,Protect这个权限,包括呢,它以上的这个public权限也都有。那比较简单好,下一个呢叫杠,其实呢,准确的说呢,叫private,那杠private的话呢,就是大于等于private这个权限呢,都能看到。
06:06
那这个private的话,我们就简写成叫杠P。其实这里边你会发现他们这个protect跟private呢,都是P开头的3P是吧,嗯,啊行,然后呢,这个杠P看一下Java p-P,然后呢,还有Java p t.glass对吧?好,这时候我们一回车,此时的话呢,我们显示这个信息呢,就比较丰富了,大家会发现呢,我们当前这个类当中生命这些结构呢,其实就全部给我们显示出来了。对吧,哎,全部帮我们选出来,嗯,这个呢,主要指的就是杠P就是P就是private的意思啊,这个你可以把它写权也行,那就是大A等于private权限的结构呢,就全部呈现出来,注意这里边儿是没有我们说的这个非静态代码块的。没有非静代码块啊,这个资质中都没有,只有我们这个静态的代码块,非静代码块呢,我们包括呢,针对于构造器集合在一起,它会对应的有一个叫init这个构造体方法啊,这呢就是合成在一起了啊行,那我们接着说。
07:02
下边这个呢,叫杠package package就是我们说的包呗,对吧,跑一下。扎P杠。Package。Class,对吧,回撤一下,那这种列出来这个信息都是什么呢?大家好像会发现说诶跟我们上边好像没什么区别是吧?这里边儿呢,说显示程序包叫受保部的或公共的这个成员,这里边私有的首先是没有的。除去私有的之外呢,这个以上的这个这个包括默认权限以上的这个结构是有的,所以跟上边这块呢,猛一看一样,其实细节呢是有区别的。对吧,是这也是有区别的,我们这个里边呢,其实就只有一个自解码文件对应的这个类,所以也不会说呈现其他额外多余的类了,那这块呢,大家了解一下,就是显示的就是非私有的这个信息。非私有的这个信息,OK,再往下杠CF,它呢就显示正在处理的类的系统信息,包括你的路径啊,大小啊,这个最起码文件的一个生成日期啊,MD5散列值啊,原文件名等等跑一下。
08:09
In,对吧?Java p test.class。嗯,这就出来了,下边这个类的这个信息呢,其实也有,但我们主要关注的是上边这块。关注主要是这块对吧,我们这个呢,是对应的路径呢,是在这块了,就是相当于我们整个这个处理的资金码文件它的一个路径,然后呢,你最近的一个修改时间,你看也有,然后这个资金码文件那个大小也有,MT5散列值也有,然后编译是从哪个文件里边编译到的,就是原文件的一个文件名,原程序的文件名也给我们显示出来了,这呢就是杠S,就是系统信息,那比较简单,就是我们主要的这个文件的相关的一些这个辅助信息啊,然后再往后呢,叫杠constant,就是显示静态的final的这个值,最终常量,其实就final的意思啊,跟那个长其实俩人俩有点重复了,就是静态常量,对吧。
09:03
这个呢,我们就Java p杠叫constant加个S,然后Java p test.class啊回车一下,那这时候大家会发现呢,我们此时生成的这个结构好像跟跟上边我们package下边生成的类似,但是这里边区别你注意我们这里边儿关于这个全局常量,前面这些呢,都不包含它具体的这个值。对吧,都不包含区,这个值只显示它的这个结构,而我们这个常量的赋值呢,它其实是比较早的,那我们此时呢,在查看的时候,包括这个一也会出现在咱们的常量池当中,对吧?这里边儿呢,显示我们常量这个值会显示出来这个一主要区别呢是在这。哎,主要区别是在这儿啊行,那这呢,就我们说的相关的这样的几个结构,大家呢熟悉一下,自己呢也做一个测试就行。那这几个过了之后呢,我们接着来看下边这几个。下边这几个呢,是这个黄色的,就相对来说跟我们具体的代码的细节呢就有关系了。
10:03
行,咱们做一个演示。首先加P,然后杠S加p test.class回车一下。这时候呢,大家会看到列举出来我们这些结构里边,首先呢,你会发现呢,是我们这个默认权限以上的这些结构,对吧,没有私有的了,那没有私有的情况下,我们列举出来的是这些结构的什么信息呢?主要我们看到的就是叫描述符信息。对于字段来讲,它的描述副信息就是你这个字段的类型,波尔类型呢,我们说是这个Z对吧,这个大家应该都还记得啊,波尔类型是这个Z,咱们前面讲这个具体的这个类型的时候呢,都说到过,然后这个叉呢,就是这个C,这呢也是一个属性是string类型的,那我们说这个类类型呢,首先都是一个L,然后后边呢,就是你具体一个类的一个情况,最后呢,记得加上一个分号结束。嗯,这个counts呢,是一个int类型是个I,然后下边呢,是关于这个包括构造器在内,我们都可以看成是这个方法的这个整体结构,那方法整体结构它的这个描述符呢,就涉及到了它的返回值类型,以及呢它的这个呃,行参的一个信息。
11:13
你看get number呢,我们这个型参呢,是有一个的是I类型是吧,反殖类型呢,是一个in的型也是个I啊就这样。行,这不用多说,这呢主要刻画的就是我们说内部类型的签名,主要涉及到呢,就是描述符的信息,哎描述符的信息好,那大家会发现呢,默认我们这杠S呢,是不带这个私有的,那如果你想带上呢,加P我们有杠S是不是还有一个杠P啊,那这时这时候呢,我们两个指令呢,就可以合在一起啊,进行一个操作。你看这时候呢,我们再回车执行,你会发现呢,这个私有的结构呢,就帮我们带上了是吧。那对应这个信息呢,我们就不多说了,这个都清楚,好这呢,就我们说的这个问题啊,那接着的话呢,我们再看呃,下边这个啊,下边这个呢叫杠L,它叫输出行号和本地变量表,或者呢,也称为呢叫做局部变量表,对吧?哎,就local variable table,嗯,所以local呢,翻译成本地或者叫局部都可以扎P,然后杠L。
12:15
大p test.class回撤一下行,那这时候呢,大家会发现呢,生成的我们这些结构前面的这些字段的话呢,我们在这个呃,一个字节一个字节去解析的时候,或者使用j lab的时候呢,它是没有局部变量表的,只有呢,我们关于这个方法啊,这里边包含了我们说构造器这个相对应的这个方法,他们呢,是有这个局部变量表的,对吧?包括呢这个行号表。啊,Line number table,那这个local web看是不是都有啊。将把这个情形呢给列出来了。哎,这个注意啊,给我们列出来了行,当然这里边呢,大家注意一个细节,什么细节啊,咱们现在使用的是不是在这个二的这个目录下,就是我们当初编译的时候,是不是用上这个杠T指令之后得到的这个这个最起码文件对吧?那如果呢,大家针对的是这个杠一。
13:08
看一下。这个杠一生成的这个自解码文件里边是不是不包含旧变量表啊,那这种情况下,你看我们CMD一下。这个在一里边啊,我现在加P,然后杠L,然后加PT点。Class,对吧?这时候我们再做一个回车,此时呢,大家会发现我们这时候的这些方法里边只有这个行号表就没有局部变量表了,说这个怎么没有了,你这边写了说有局部变量表嘛,这个是因为我们本身的自解码文件当中就不包含局部变量表的信息,对吧?所以呢,自然而然这里边就没有了。行,这个大家清楚这个事儿,那如果你要包含了这个局部变量表信息的话呢,我们加上这个杠L是可以帮我们生成的。那也是可以帮我们生成的,好这个呢,就是咱们说的这个情况。
14:00
那接下来我们再说Java p,然后杠,注意下面这两个指令呢,就比较重要了,下边这两个指令就比较重要了,首先呢是这个杠C,然后Java p test的点自解码文件,然后我们做一个回撤。那这时候大家会看到,诶,这个信息量好像更大一些,对吧,这里边儿呢,你看主要列举出来的是什么呢。就是咱们对应的包括构造器在内的这些方法的扣的属性。那扣的属性里边咱们知道,就是你当前这个方法是吧,它的一个具体的执行细节吧。哎,这就是咱们相当于自建码指令啊,或者你准确的说呢,是有一个叫操作码啊,这个呢是一个操作码,然后对应着后边一个操作数对吧,这样的一个情况。就是这个C呢,大家你又可以理解成是咱们说的那个叫code,那扣的属性里边放的这个,咱们之前不也都在这块都看过是吧,比如你打开这块看。啊,这个程序,然后呢,咱们这一个接class lab,然后这块看到的关于我们这些方法,咱们前面不都带着,大家也说过吗?扣在这块这不看到的就都是这些。
15:09
哎,具体的执行的这些指令嘛,就这些情况,那相当于我们使那个杠C看到的主要就是这些信息。哎,主要就是这些信息,好,那这个呢,是我们说到它,那为了呢,跟我们这个杠V呢,看出它俩的一个区别,我这样一下按一下上,咱们把它呢写出到一个。文件里边。这是二,那我来一个3.t行,这个你注意咱们使用的是这个杠C指令,然后下边呢,我再使用JAP,杠V指令,然后javap test加class,这个你要想先看一眼也行,那就这块呢执行一下。那就看到了,这里边儿呢,也包括我们具体方法的这个磁解码指令,那除此之外呢,你会发现呢,是包括我们这个行号表和这个本地变量表了,对吧,然后咱也可以把它呢,也写入到一个4.txt文件中。OK对吧,那现在的话呢,我们打开这个二里边就有一个三一个四,咱们再使用这个文件对比的工具。
16:08
啊,稳稳比较这块呢,我们选择一下这个三。嗯,是二目录里边的。然后右边呢,也同样的选择一下二目录下的这个四,左边的话呢,咱们使用的是这个杠C,右边呢使用的是杠V,对吧,那我们去比对一下,一上来呢就不一样,我们发现呢,这个杠V里边包括了咱们这个自己去解析咨询码文件的时候呢,是不是涉及到过你当前这个最起码文件这个类的最小版本啊,最大版本啊,或者说这叫小版本大版本,副版本主版本对吧?这个访问标识啊,那这不都有吗?这个20这个是一还记得吧。嗯,然后这个constant pro叫常量池信息,你看我们这个杠C里边是不是没有,杠V里边是有的,好再往下的话呢,关于我们这个提到这个描述符的信息。
17:02
你看这边也没有对吧,然后在右边这块呢,你看主要区别关于方法这一块,包含这个构造器在内,主要区别呢,就是我们杠V里边包含了就是line number table和local web,而左边这块呢,其实我们使用这个杠C,咱主要看的就是方法的这个最解码指令,哎,如果你想看到这个信息比较全的话,咱们用这个杠V。你看是吧,嗯,主要多的就是这个行号表和这个local web table,那这个这两个信息呢,咱们刚才也演示了,是不是主要呢,就是通过这个杠L来呈现的呀,它主要呈现的就是行号和本类变量表,对吧?哎,所以这个杠L跟杠C呢,它俩呢正好是互补性的,而这个杠V或者呢,你写成叫杠我boss也行,他呢,呃,输出的这个信息应该说就是最全的了。就最全的了,所以这块呢,大家就知道为什么咱们一开始稍微给大家讲解的时候呢,就是咱们一开始是不是在比对那个杠G的区别的时候,呃,生成这个1.tt的时候,我用的是不是这个杠V啊。
18:04
还记得吧,刚才我们演示的时候,就是这时候呢,我们尽量的要保证你这个信息呢,要尽可能完整,在完整的情况下呢,我们比对他俩的这个主要区别在哪。OK,行,那总结一下。这个前边的这些指令呢,咱们就说完了,后边这还有几个呢,我就不一一一去介绍了,这个咱们平时用的也非常少啊,那通过刚才这样的一些解释呢,咱们最终落地说一下咱们常用的,常用的话呢,咱们主要呢,这反解析这个自己码文件,咱主要看的其实还是下边这些情况。包括上边这些公共的也好,还有这个私有的也好,如果你想看他们的详细细节,这不也是下边的都包含了对吧,那我们这个如果大家想看的信息比较全的话呢,那大家就使用这个叫杠V,或者呢,你用这个杠我boss都行,他俩呢用哪个都可以,一个呢是简写啊,一个是全称,那如果说这个杠V啊,这个。注意这个,顺便再说这个事儿,你看这个岗位里边包不包括咱们说的那个私有的结构啊。
19:06
我这是一里边不是他了,咱们看这个这个是吧。嗯。哎,咱往上拽一下。这是常量池,看大家大家这块看我们现在使用这个杠V,然后生成的这个关于我们这个自减码文件的一个解析,这个时候呢,大家你往下找,我们会发现此时呢,是不是仍然不包括私有的这个信息啊。对吧,诶仍然不包括私有信息,包括这个方法这块呢,私有的方法也没有帮我们列出来,你看这是默认的,这是protect public,我我先写的时候是先上面放在私有的,那私有的这个里边。是不是也没有帮我们呈现,嗯,在这儿是吧,也没有帮我们呈现出来,行,那就意味着就是咱们现在使用的这个叫杠V,它里边呢,也是不包括这种私有的结构的。那要想包括的话呢,或者换句话说呢,咱们想整一个最全的一个信息。那怎么办呢?我们就可以综合着使用这个例子,这个参数啊,扎P,然后杠V一下,保证呢,就是我们包括局部倍量表,常量池,包括我们这个方法里边的资金码,指令行号表及变量表都给我们呈现出来,你再加上一个杠P,就是包括私有的权限对应的结构在内的啊,大于等于private的,然后你写一个哎,加P,然后test加class。
20:26
哎,这个呢,是不是就我们所说的就最全的了。这里边儿呢,你在网上找咱就能看到这种私有的这种方法,包括私有的这个属性,哎,咱不叫属性了,私有的字段是吧,诶也都有。嗯,就是这样个情况,那以及的话呢,就是你看我还把它调出来这个点class,你看我要不写呢,一回车,那是不是也能够帮我们呈现出来,对吧?行,那这呢,就咱们把这几个指令主要说完了,大家需要重点掌握的一个是杠V,一个是这个杠P。把这两个大家重点关注一下,而且呢,我们可以合并在一起去写就行了,那主要这个区别对比上呢,大家关注一下这个杠L-V和杠C它俩的一个区别,他们三个的一个区别,行,那这样的话呢,咱就把这个P,具体的这个options呢,咱们就给大家呢介绍了一下。
我来说两句