00:00
好,那么接下来啊,咱们来看一下这个扎P的一个使用啊,扎P的使用这个回溯到我们一开始提到这个class文件这块class文件呢,我们说要想对它进行解析的话,咱们其实提到过三种方式,第一种方式呢,就是咱们前面花了比较多的这笔墨呢,带着大家呢,一点点来分析的我们这个自检码文件,对吧?持有今日来表示的一个一个的字节,我们如何进行经如何进行解读,在这个方式一解读的过程当中,我们为了呢,就是便捷的大家看到一些细节呢,咱们呢,结合了一下这个方式三。方式三的话呢,我们既可以在idea当中使用这个j class lab这样一个插件,也可以呢,使用这个j j lab这个back code VI这样的一个客户端,大家呢,去比照着进行使用就行,那除了这两个方式之外呢,我们说还有一种方式叫做扎P这个指令。这个指令的话呢,是Oracle官方给我们提供的啊,我们在这块也可以说一下。说呀,反编译生成的自解码文件呢,呃,这个可以深入的了解Java代码这个工作机制,咱们前面呢也给大家讲过,说咱们为什么要查看这个自解码文件,对吧?包括这个自解码指令,这个对于咱们Java工程师来讲是比较有意义的啊,因为很多的这个细节,代码的一些细节情况呢,我们在代码层面是看不出来的,咱们当时呢,这不是给大家举了是不是三个例子啊。
01:21
有些细节呢,我们在代码层面看不出来,咱们呢就需要来看一下这个自解码指令是怎么来处理这样的一些逻辑的,对吧?这个咱们前面已经说过这个问题了,那我们说自己看的很麻烦,这个大家呢,也就自己在讲这个课的时候呢,你自己呢也分析一下,那日后的话呢,就完全没有必要了,那除了这个接卡lab这个工具之外呢,我们还可以使用这个jarp。啊,Oracle官方自带的,然后通过这个JP工具呢,我们可以反解析出当前对应的代码,这个code属性,那code的区里边呢,就是咱们的方法体的这个自解码指令对吧?包括呢局无变量表啊方法如果有异常,还有异常表,包括呢我们这个代码呢,行的偏移量等等,包括呢咱们这个constant po常量池信息都有。
02:11
尤其在常量池里边呢,当然呢,需要体会的就是那个符号引用的意思啊,加载之后呢,我们对应到内存中就会有这个直接引用,OK。行,那么通过这个局无变量表的话呢,这是我们说code的属性里边的一个叫local variable table,咱们呢,前面给大家分析过啊,这个局无变量表我们查看它的话呢,还可以查看一下作用玉的一个范围,曹魏的信息,包括曹魏的复用等等,这个呢,在咱们前面讲上天占的时候呢,提到过这个曹位服用的问题,那这个忘了的同学呢,你可以回过去再看一看。行,这个呢,就是我们提到说,诶这个使用JP这个指令,它的一个作用,其实跟咱们使用这个第三方的J呢是类似的。那在具体的我们展开讲这个扎P这个指令之前啊,咱们呢,诶在编译这块呢,再给大家说一个事儿。
03:02
编译这块呢,说有什么可说的呢,咱们呢,这个自己呢去编译,或者说呢,咱们使用比如说idea,嗯,咱们都讲过啊,默认的用的这个前端编译器呢,就是Java c,这个Java c的话呢,我们说直接后边就配你这个原文件带上后缀就可以了,会编译出我们这个原文件当中的这个一个或多个自解码文件,对吧?那这里边呢,给大家稍微强调一下,就是我们多一个这个参数,这个参数呢叫做杠G。这个加一加上这个杠G跟不加这个杠G的区别呢,就是我们生成的这个自解码文件当中,有没有这个局部变量表的一个问题。诶有没有局变量表的问题,如果呢,你带上这个杠G的话呢,我们得到的这个执行码文件当中是有局部变量表信息的,那如果你要不带不加这个杠G呢,就没有这个旧变量表这个信息了,那咱们把这个呢给大家呢,稍微的说一下啊,那举个例子。大家呢,来看我这里边写这个代码就叫做j p test,咱们通过这个代码呢,带着大家去熟悉一下咱们JP的这个指令的一个使用,那这个代码里边我写的还是比较丰富的,暂时的这个细节啊,咱们先不过多去看,咱们呢就先说一下这个前端编译器当中这个杠T参数的一个情况,好的,那首先的话呢,关于这个。
04:21
这个原程序啊,咱们这块呢,就放到这儿了,然后呢,我在这个JP test这个源代码这个位置啊,我点击一个操作就open terminal啊打开,就此时呢,就定位到我们当前这个原文件,它所在的一个路径,那下边呢,就咱们自己手动呢进行一个解析啊,进行一个编译啊Java c,然后呢,哎,Java p test.java这个所有同学应该都会对吧?好,我们这时候呢,做一个回车。加上我们这个呢,源代码进行了一个编译,编译之后呢,我们这边刷新一下。大家会看到生成了一个JPT的字节码文件,对吧,我们把它呢,CTRLCL一下。我放在这个桌面上,咱们比如说新建一个文件夹,我这就写成个一吧。
05:04
啊,CTRLV行,然后此时呢,把这个词件码你文件呢就放到里边了,然后接下来呢,我们再啊重新的操作一下这块,你把它删也行,不删也可以啊。因为你要不删的话呢,我们再操作呢,就会做一个覆盖啊都行,Java c,然后呢,我们来一个杠G,然后诶Java p test.java。能理解吧,现在呢,我们加上这个参数叫做杠G,然后再回车执行。然后再刷新,此时的话呢,又会生成一个j p test的自建码文件,哎,这个呢,再CTRLC一下,我呢再生成一个。文件目录这个呢,称为这个叫二。啊,CTRL进来行,那么这个时候啊,我说这两个自解码文件呢,它是不太一样的啊,咱们来看这个事儿呢,首先比如我们打开这个一。大概这个一,这个一的话呢,大家点右键,我们查看一下这个属性这个啊直接在这看就行,然后把我们这二呢,同样呢,大家也这样去做。
06:03
比对一下我们这两个文件的大小,这个第二,哎,出来了啊。诶没出来,我哎我我我要调一下这个光标,诶行,那这时候这个大小你会发现呢,我没有使用杠G的话呢,这个是1148个字节,而我们使用上这个杠G以后呢,是1358个字节啊这里边大家就会发现呢,这两个文件大小呢是不一样的,加上杠G的这个信息量呢,会更多一些,那到底多的是不是我们所谓的局部变量表信息呢?这个大家怎么去看呢?呃,这个你打开直接看这个资金码文件也行,当然显然呢,这样看大家是不是觉得有点就崩溃啊。对吧,哎,有点崩溃怎么办呢?哎,这时候我们这样把它呢,使用扎P这个指令,咱们先给它呢反解析一下啊,在命令行这块,我就先把个扎P指令,咱们就先用一下,等一下咱们具体展开,这我用了一个叫杠V啊,就是保证他们俩呢,这个有的这个信息呢,咱们都给它完整的显示出来,我把这个生成的反解析的数据信息呢,写到1.tst这样的一个文件当中回车一下。
07:09
好,这有这个文件了,然后右边的话呢,我们也同样的这样做。嗯,扎P咱们这时候呢,保证你使用的参数呢,都是杠V,那一会儿呢,关于这个杠V呢,咱们再给大家详细展开来说,然后是我们这个扎p test.class这个文件,把它写入到2.tst这个文件当中,回车一下可以了,那这个时候呢,我们就生成了两个是不是反解析之后的这个信息了,咱就别自己一个一个去看这个自解码了,这就很崩溃,那解析之后的这个信息我们进行一个查看,这个呢你可以双击打开。这呢就是我们没有使用杠G的,然后这个呢,你再双击打开,这就是使用杠G的,大家呢,去比对一下这两个的一个区别,你看这呢,有194行,这个的话呢。174行中间呢,少一些行,但到底少哪些,大家自己呢去比就行,但是这个要比的话呢,是不是有点又崩溃了,对吧?所以这块呢,再给大家介绍一个工具,这个工具呢,就叫做我们这个啊beyond compare这个双击打开。
08:10
这个工具的话呢,挺好的,大家也可以呢下来去装一下,可以呢,去比较文件夹,也可以比较文件,两个文件的一个区别,文件比较,比如我点击它在左边这块,我点击一下,把咱们这个一点TS点选中。然后右边这块呢,我们也选择一个文件。咱们选择一下这个二里边的这个2.tst文件,好,那这两个文件呢,它会自动的,诶给我们做一个匹配,发现呢,它们不同的这个部分,那两个不同的文件呢,这个MD5的这个格式肯定是这个具体的这个数值字符串序列呢,就不一样了,对吧?文件目录也不一样,然后这块对应的这个,呃,我们再去访问的字符串常量池的这个索引呢,也会有区别,这个很正常是吧,往下看,然后在我们右边这块,你发现会多一个这个字符串的一个。这个叫字变量是吧,叫local variable table,就是我们说的局变量表信息,然后这块呢,这个字符不一样很正常,主要呢,我们看下边。
09:05
下面的话呢,我们关于当前这个类中的构造器,关于这个比如get number这个方法,包括下边这个方法,你会发现的话呢,主要的跟左边没有加杠G的区别。咱左边呢是没有杠G的是吧,右边呢是加上这个杠G的,大家会发现呢,主要区别是不是就多了一个相关方法中的局部变量表的信息啊,你看每一个都是这样的。这这没显示一个,这都是一个新的方法对吧,包括我们或者是这个静态代码块,看这里边也有这样的问题,行,那这块呢,就非常清晰的能够看到啊,我们就把它关掉了啊,回过来这个加上这个杠G呢,我们说就能看到对应的这个方法里边的局部变量表的信息,你要没加杠G呢,就不行。诶,没加当了就不行,刚才呢,这个静态代码块也有静态代码块对应的,我们说是不是会生成一个叫CL这个A这样的一个构造器方法,对吧?哎,类构造器方法,那这里边呢,相当于也是一个方法了,所以呢,也会涉及到局部编量表的一个信息,这个大家稍微注意一下,行这个呢是我们自己来进行一个编译的时候的问题,那接下来呢,第二个情况就是咱们平时的话呢,是不是很少直接自己去编一个代码啊,咱们都是使用的成开发环境eclipse呢,或者是idea对吧?那么对于这两个典型的提升开发环境来讲呢,默认的我们使用他们俩的这个编译器在编译的时候呢。
10:26
哎,大家注意,这时候的这个局部变量表也会自动的帮我们生成。也会自动的帮我们生成什么意思,这个意思大家看现在的话呢,我们这个针对这个扎P这个程序,呃,我们要是点右键去做一个,呃或或者他这没有这个main方法不能执行了,我们这块直接是不是做一个build,进行一个re compel就行,对吧?那这个时候呢,它自动的帮我们做一个编译,它编译之后呢,是帮我们放到了是不是al这个下边。看到这儿了,对吧,那现在的话呢,我们刷新一下,此时呢,你发现没有这个p test这样的一个编译情况,那我这块呢,做一个re compel编译一下。
11:05
这就使用我们idea呢,自动的啊,帮我们做了一个编译,编译之后呢,我们做一个刷新,大家会看到这时候已经有这个j p test了,对吧,我们把它呢CTRLCL一下。行,然后在桌面呢,咱们再去新建一个文件夹,比如我这块呢,叫做三。CTRLV打开这个三的话呢,是咱们自动的是不是生成的呀,就是使用我们这个idea自动生成的,对吧,那我们看一下这个文件的一个大小。这个文件大小跟我们这个二呢,大家做一个比对。这块你看诶1358135840964096没问题是吧,那通过这个呢,大家也能发现,就是我们这个idea呢,他自己帮我们编译生成的这个C级码文件里边呢,是包含是不是局变量表的呀,没问题对吧,如果大家你要不放心的话呢,你也可以在这CMD,哎,这个我们使用JP呢给它做一个解析。
12:05
哎,把它比如我们写到3.tst这个文件当中。好写好了对吧,写好之后的话呢,我们再使用刚才提到这样一个文件比对的一个工具。打开这个工具文件比较比较的话呢,左边这块我们选中一下,比如二里边的这个2.tst。然后右边。咱们选中刚才这个三对吧。3.tat行,那这个两个做比对你会发现呢,哦,他们这块都有这个局部变量表信息没问题对吧?那下边你看基本上都是一致的,好,那这个呢就非常清晰了,也就是说呢,这个eclips也好,Idea也好啊,这个idea eclipse呢,我就不带着大家呢再去验证了啊这个说一下就行,这两个集成开发环境在编译的时候呢,都会帮我们生成比较完整的包含局部编量表信息在内的一个自节码文件。啊,就是如果大家自己你要是手动的去这个使用这个javac这个指令的话呢,建议大家你加上这个杠G啊,就是这个意思啊,我们两个集成开发环境呢,默认是有这个杠锥的,好,那这里边呢,咱们是已经用了一下这个扎P,其中用到一个参数呢,叫做杠V,那除了这个杠V之外,还有哪些参数,关于扎RP的一个详细使用,哎,咱们下边呢,展开来说。
我来说两句