【问题标题】:Why do I get a different 'class' file after changing only symbol names?为什么只更改符号名称后会得到不同的“类”文件?
【发布时间】:2014-02-27 13:19:53
【问题描述】:

为什么当我只更改相应“java”文件中的符号名称(类、接口、函数或变量)时,Java 字节码解释器会更改“类”文件?

我在源代码控制 (GIT) 下维护这两种类型,并且我一直看到“更改文件的数量是两倍”,即使是上面提到的外观更改也是如此。

顺便说一句,问题不是关于源代码控制问题,但仅供参考,我将这些文件保留在 GIT 上的原因是为了能够“清理”(删除所有未版本控制的文件),然后在不重新编译的情况下从命令行运行程序。

如果您知道如何实现此功能(无需构建即可运行),那么我会很高兴听到它...

谢谢

【问题讨论】:

  • 你不应该在git中存储.class文件。
  • 谢谢 SLaks。总的来说,我会同意这一点,并且我会在某个时候摆脱它们,但这并不是真正的问题。
  • 为什么改变符号名不会改变类文件?
  • @Peter Lawrey:据我所知,在 C 和 C++ 等本地语言中,可执行文件在“真机”上运行(与 Java 相反,可执行文件在虚拟机) - 更改符号名称不会影响可执行文件(除非它包含调试信息,我什至不确定)。我猜我对 Java 字节码解释器的期望是错误的......
  • @barakmanos 更改符号确实会影响即使在 C 和 C++ 中生成的二进制文件,因为您可能有调试信息或稍后将被链接器绑定的模块。例如,如果您转储 strings a.out,您会看到许多对方法名称的调用。

标签: java version-control bytecode


【解决方案1】:

出于多种原因,JVM 需要访问符号名称,包括以下原因。

  • JVM 使用符号名称来查找类、方法等。
  • 符号名称的存在使我们能够编写使用反射的代码。
  • 引发异常时,符号名称会出现在堆栈跟踪中。

所以符号名需要存放在类路径中。

【讨论】:

    【解决方案2】:

    因为类文件包含符号名称。

    通常,人们不会将他们的类文件保存在源代码管理中。如果有人想要一个旧版本的类文件,他们会得到旧的源文件并编译它。

    【讨论】:

    • 请参阅我关于源代码控制问题的附加说明(虽然这不是问题的主要目的,但似乎每个人都在解决这个问题)。除此之外,感谢您的快速解释。
    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 2020-10-20
    • 2011-11-04
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多