【问题标题】:How does scalac mark compiled files?scalac如何标记编译文件?
【发布时间】:2018-01-19 06:24:56
【问题描述】:

看看this question。当您打开启用了 scala 插件(Intellij Idea)的.class 文件时,它会显示 scala 代码,但是当它关​​闭时 java decompile 插件会显示反编译的 java 代码。请注意,即使启用了 scala 插件,javac 编译的 .class 文件也会反编译。这意味着 scala 插件“查看”类文件中的一些标记并拦截显示的文件内容。

它实际使用的标记是什么?有没有办法打开.class 文件并更改编译器(和/或)其他信息集以使这些类看起来像是由javac 编译的?

【问题讨论】:

  • 您没有提供太多细节(例如哪个 IDE,例如您如何将依赖项附加到项目,例如 jar 文件是否附加了“源 jar”)。在 Internet 上搜索,它看起来甚至没有 scala 反编译器,因此您的 IDE 中的 Scala 插件很可能知道在源 jar 文件中查找具有 scala 文件扩展名而不是 java 文件扩展名的源文件。
  • 查看原始问题。 IDE 是 intellij idea(问题已更新),jar 文件仅包含已编译的 .class 文件。 没有任何带有java或scala扩展名的文件。
  • 启用 scala 插件后看到的“源”,它是否包含 any cmets?版权免责声明、javadoc、多行 cmets、内联 cmets?如果是这样,它不会被反编译,因为没有反编译器可以做到这一点,因为 cmets 没有存储在 .class 文件中。

标签: java scala javac bytecode-manipulation scalac


【解决方案1】:

每个类文件都可以有一个SourceFile attribute,其中包含源代码文件的名称。由于这是一个任意字符串,它有点关于约定,例如对于 Java 源代码,它通常只包含文件名,不包含任何特定于包的目录。

所以仍然有一些信息的解释,例如如果指定的名称以.java 结尾,IDE 必须在与实际包匹配的子目录中查找已知源代码树以查找匹配文件。

确定源文件不是 Java 就像识别它具有不同的文件名结尾一样简单,然后,如果知道它的插件已安装,则可以使用用于特定语言的任何约定。否则,大多数 IDE 将简单地查找具有该名称的任何文本文件并显示它。可能有LineNumberTable attributes,告诉了字节码指令如何映射到源代码行号,允许调试器在不了解源代码语法的情况下单步执行代码。我已经通过这种方式逐步完成了从 XSLT 文件编译的代码。

当然,指定源代码文件名的模式也可以用来在源文件没有找到时决定使用哪个反编译器。

【讨论】:

  • 真的吗?你能做到吗?
  • @Eugene 当时我还使用 Eclipse 调试了向下移植的 Java 8 代码,当时它不支持 Java 8。调试只是通过文件名和行号关联进行。它甚至试图突出显示代码,但你不得不忽略红色下划线......
  • 你活了多少次?我现在什至不敢尝试,所以与“开箱即用”的东西一起使用......
  • @Eugene 在 XSLT 调试的情况下,它甚至不是故意的。我使用 xslt 处理器(很可能是 xalan)调试了 Java 代码,然后突然跳到 xslt 处理器生成的代码中,最终到达了我的 XSLT 文件中的相关点,甚至能够从堆栈跟踪。
【解决方案2】:

Intellij 理念

Intellij IDEA(假设您的问题是关于这个 IDE),只需找出二进制文件是从哪个源文件编译的,然后显示相应的源代码。

它不会从二进制文件中提取或生成源代码。它只是能够找到给定二进制文件的来源。您可以通过匹配文件名和路径来做到这一点。不过,Intellij 可能做得更多。

一般

一般来说,几乎可以肯定没有好的反编译器可以从类文件生成 Scala 源代码。源代码也没有嵌入,所以你只能尝试将源代码文件与二进制文件匹配。

反编译得到的 Java 代码是当 IDE 找不到相应的源文件时显示的。

【讨论】:

  • “只是计算出二进制文件是从哪个源文件编译的”和...它是如何做到的? class中一定有一些信息。就是这个问题。
  • @Cherry 如果你有源文件,你就很清楚生成的类是如何命名的。因此,从源代码开始,您可以构建映射并对其进行反转。关键是您可以在类文件中没有任何“标签”的情况下执行此操作。您只需要知道构建过程是如何工作的。 IDE 应该知道这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多