iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >为什么给Java代码加个空行class文件就不响应了
  • 375
分享到

为什么给Java代码加个空行class文件就不响应了

2023-06-16 15:06:30 375人浏览 安东尼
摘要

本篇内容主要讲解“为什么给Java代码加个空行class文件就不响应了”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“为什么给Java代码加个空行class文件就不响应了”吧!1. 翻脸不认人Ja

本篇内容主要讲解“为什么给Java代码加个空行class文件就不响应了”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“为什么给Java代码加个空行class文件就不响应了”吧!

1. 翻脸不认人

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

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

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

(1) 打脸

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

为什么给Java代码加个空行class文件就不响应了

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

为什么给Java代码加个空行class文件就不响应了

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

为什么给Java代码加个空行class文件就不响应了

(2) 抹药

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

为什么给Java代码加个空行class文件就不响应了

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

变了。这次真的变了。

为什么给Java代码加个空行class文件就不响应了

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

为什么给Java代码加个空行class文件就不响应了

2. 骚戴斯乃

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

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

javap -p -v HelloWorld.class

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

为什么给Java代码加个空行class文件就不响应了

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

为什么给Java代码加个空行class文件就不响应了

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."<init>":()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可以在编译选项里对这个参数进行开启。有很多同学在编译之后的代码里找不到局部变量的符号表,也是由于这个参数没有开启所引起的。

为什么给Java代码加个空行class文件就不响应了

到此,相信大家对“为什么给Java代码加个空行class文件就不响应了”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 为什么给Java代码加个空行class文件就不响应了

本文链接: https://www.lsjlt.com/news/284135.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 为什么给Java代码加个空行class文件就不响应了
    本篇内容主要讲解“为什么给Java代码加个空行class文件就不响应了”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“为什么给Java代码加个空行class文件就不响应了”吧!1. 翻脸不认人Ja...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作