所以我有一个包含 scala 作为源代码的 jar 文件,我丢失了原始代码。有没有办法将 jar 中的类文件转换为 scala 函数和类,而不是编译器生成的 java 类?
我试过在它上面使用反编译器,它只给了我零意义的java代码。
先感谢您!
所以我有一个包含 scala 作为源代码的 jar 文件,我丢失了原始代码。有没有办法将 jar 中的类文件转换为 scala 函数和类,而不是编译器生成的 java 类?
我试过在它上面使用反编译器,它只给了我零意义的java代码。
先感谢您!
你需要一个 Scala 特定的反编译器。没有理由不能写出来,但这将是一项巨大的努力,据我所知,没有人真正做到过。当然,它不会完全生成原始代码,就像其他语言的反编译器不会一样。
Scala 编译为 JVM 字节码,与 Java 的编译目标相同。除非反编译器明确针对 Scala,否则反编译为 Java 是有意义的。
为了补充 Alexey Romanov 的答案中的信息,该信息对于 Scala 2 仍然有效且有效,我想补充一点,因为 Scala 3(又名 Dotty,它的开发名称),Scala 首先编译为中间表示,TASTy(添加将抽象语法树信息键入到已编译的类文件中——因此得名)。
您可以在 Scala Days 2019 的这个有趣的演讲中看到关于 TASTy 及其在编译器管道中的作用的演示。
正如演讲中提到的,Dotty 原生提供了反编译编译输出(TASTy + 类文件)的可能性。
作为一个简单的实验,让我们在一个文件中考虑这个非常简单的程序Main.scala
:
object Main {
def main(args: Array[String]): Unit = {
println("hello, world")
}
}
在它上面运行dotc Main.scala
会产生预期的输出(一个.class
用于Main
类的文件,一个用于Main
对象和一个.tasty
文件),可以使用选项将其反馈到(反)编译器-decompile
,如下所示:
dotc -decompile Main
该命令的输出如下:
/** Decompiled from ./Main.tasty */
@scala.annotation.internal.SourceFile("Main.scala") object Main {
def main(args: scala.Array[scala.Predef.String]): scala.Unit = scala.Predef.println("hello, world")
}
您可以按照此处的说明开始使用 Dotty 并执行与我所做的相同的实验,该实验使用 Dotty 0.27.0-RC1 运行。