6

所以我有一个包含 scala 作为源代码的 jar 文件,我丢失了原始代码。有没有办法将 jar 中的类文件转换为 scala 函数和类,而不是编译器生成的 java 类?

我试过在它上面使用反编译器,它只给了我零意义的java代码。

先感谢您!

4

2 回答 2

3

你需要一个 Scala 特定的反编译器。没有理由不能写出来,但这将是一项巨大的努力,据我所知,没有人真正做到过。当然,它不会完全生成原始代码,就像其他语言的反编译器不会一样。

于 2016-03-02T07:08:33.710 回答
1

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 运行。

于 2020-09-14T12:37:09.977 回答