0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么给Java代码加个空行class文件就识别不出来了

Wildesbeast 来源:今日头条 作者:小姐姐味道 2020-02-18 16:02 次阅读

为了写出这几行优美的代码,主要是为了让它输出优美动听的乐符,我下了一番功夫。你不要觉得简单,我把它打印出来给普通的保洁阿姨去看,阿姨竟然连xjjdog都认不出来。别说代码了,中英文混血,就秒杀一大堆高干分子。

想说爱我就那么难么?怎么这么多的废话呢?这次探讨的主要问题是,给Java源文件加个空行之后,它生成的字节码,会有变化么?

1、翻脸不认人

Java号称一次编译到处运行,大概就是class文件的功劳。不同的Java版本编译之后的class文件那是肯定不一样的,因为里面有一个版本号,那肯定影响了它们的内容。

我们就看一下,如果给上面的代码,加一个空行,它的class文件会不会变。

这个空行还不能随便加。它可能在xjjdog上面,也可能在下面。可能在{中,也可能在文件末尾。

1.1、打脸

在验证之前,我们先看一下当前的class文件md5值。

我非常喜欢被打脸,所以先看一种加空行也无所谓的情况。

再次编译之后看md5值,果然被打脸了。还好我已经练就了脸不红心不跳的本领,这个结果厚着脸皮接受。

1.2、抹药

为了和主题遥相呼应,安慰一下受伤的心灵,我们把空行转移到了这里。

再次编译之后,看md5值(怎么感觉这句话已经说过了呢)。

变了。这次真的变了。

使用hexdump命令分析两次生成的字节码,发现其中只不过变了一个数字。

2、骚戴斯乃

特别不喜欢分析这种二进制的东西。虽然CAFEBABE这个魔数在第一行历历在目。咖啡宝贝?怎么听着像是某个番号?

我们还是用javap来看一下它的原型。

javap -p -v HelloWorld.class

通过对比两次生成的字节码,我们终于发现了这个变动,是一个叫做LineNumberTable的结构引起的。

使用asmtools.jar深入分析这个结构,可以看到同样的信息

LineNumberTable展示了Java源码行号和字节码指令的对应关系。前面的数字代表Java源代码中的行号,而冒号后面的则代表字节码里每行指令的映射关系。在对代码进行调试的时候,能够快速定位,顺利进行。

也就是说,这些是辅助信息,我们可以在编译的时候抹掉它。怎么抹掉呢?给javac一个参数就ok了。

javac -g:none HelloWorld.java

这样编译后的字节码,紧凑、优雅、无用。不管你加多少空行,生成的字节码都是一样的。可是,我们再也不能畅快淋漓的进行调试了。

{ public HelloWorld(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=1, args_size=1 0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3 // String Hello xjjdog 5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return}

要想在开发阶段让字节码又香又有用,可以直接使用参数-g开启所有调试信息。IDEA可以在编译选项里对这个参数进行开启。有很多同学在编译之后的代码里找不到局部变量的符号表,也是由于这个参数没有开启所引起的。

END

麻雀虽小,五脏俱全。能写HelloWorld,就证明已经凌驾于大部分人之上,能了解这些东西,就证明已经是人上之人。怪不得大家都说:就差一个程序员了。

HelloWorld,表面上看起来人五人六,原来背地里都有自己的小99啊。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2966

    浏览量

    104695
  • 代码
    +关注

    关注

    30

    文章

    4776

    浏览量

    68509
  • Class
    +关注

    关注

    0

    文章

    53

    浏览量

    19723
收藏 人收藏

    评论

    相关推荐

    mdk5添加头文件路径检索不出来文件是怎么回事?

    mdk5添加头文件路径检索不出来文件
    发表于 05-29 07:39

    点开始,点所有程序不出来了,怎么办啊?

    `<font face="Verdana">点开始,点所有程序不出来了,怎么办啊?</font>&
    发表于 12-26 13:55

    为什么AD的drc查不出来

    为什么AD的drc查不出来(导线A经过导线B的焊盘造成二者连上)如题 谢谢回答
    发表于 01-02 21:24

    I2C读出来的是器件地址,后面的数据读不出来

    奇葩事啊,,I2C读出来的是器件地址,后面的数据读不出来,用示波器看了。数据也出来了代码运行正常,没有出现打乱的情况。PWM_Red就是读出来
    发表于 01-13 15:13

    AD打开PCB文档显示不出来

    我装的AD15原来没有一点问题,现在出现了打开以前的PCB档显示不出来了,有那位大神知道,拜谢了
    发表于 12-23 10:00

    Allegro 16.6 place manully 对话框不见了,怎么都不出来,求助!

    Allegro 16.6 place manully 对话框不见了,怎么都不出来,求助!如图,昨天突然就不出来了,并排显示窗口什么的没用,大神们求救哇。。。
    发表于 05-17 19:17

    TYPE C兼容性问题,用在雷电口识别不出来

    现在有一条走光路的TYPE C的线,普通的USB口可以识别硬盘,但是用在雷电口识别不出来。在雷电口CC沟通上了,有正常5V供电,求各位支招,可能是什么原因
    发表于 12-11 09:20

    DM8168 NAND驱动位宽从16位改到8位,ID读不出来了

    我把demo上的NAND驱动位宽从16位改到8位,GPCM好像不工作了,ID都读不出来了,哪位知道为什么?其他的都没有任何改动。
    发表于 02-15 09:53

    mup_dmp_init函数里跳不出来

    最近打算用mpu的dmp读出姿态角,可将原子探索者的mpu6050部分的代码移植过来后,在mpu_dmp_init这个初始化函数跳不出来。现象是:led灯也亮的是红灯,串口也没有返回电脑什么数据,我
    发表于 04-22 05:02

    为什么guibuilder里面的图像显示控件移植到开发版图像就显示不出来了

    其它的控件,滚动条,按钮什么的都显示正常,就图片显示不出来。。。代码是自动生成的,看来看去都觉得没什么错啊。。。有没有遇到同样问题的啊
    发表于 06-27 04:35

    请问已经创建的压缩文件cuteftp中显示不出来该怎么办??

    uboot打补丁的时候,CRT中已创建了压缩文件,但是在cuteftp中显示不出来?还望大神帮忙解决。
    发表于 09-11 04:59

    器件拿不出来

    `liberier庫器件拿不出来怎么办`
    发表于 01-08 17:05

    统计java代码行数和jar包中.class代码的行数

    本文档内容介绍了统计java代码行数和jar包中.class代码的行数,供参考
    发表于 03-19 15:27 0次下载

    美国芯片对中国的影响是没有美国技术华为手机造不出来

    美国芯片对中国的影响是什么?难道没有美国技术我们连手机造不出来?难道真像俞敏洪说的那样? 俞敏洪表示,即使是华为现在造出了自己的芯片,但没有美国芯片专利技术,中国手机一台也造不出来。你如何看待
    的头像 发表于 11-09 16:05 1.6w次阅读

    虹膜识别安全吗_虹膜识别不出来怎么办

    本文首先分析了虹膜识别是否安全,其次介绍了虹膜识别不出来的解决方法,最后阐述了虹膜识别的发展阻碍。
    发表于 04-02 14:38 3897次阅读