scalac如何标记编译文件?

时间:2018-01-19 06:24:57

标签: java scala javac bytecode-manipulation scalac

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

Intellij Idea

Intellij IDEA(假设您的问题与此IDE有关),只需确定编译二进制文件的源文件,然后显示相应的来源。

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

一般

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

您从反编译中获得的Java代码是IDE无法找到相应源文件时显示的内容。