从jar中提取scala源代码

时间:2016-03-02 02:38:30

标签: java scala jar decompiler scalac

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

我试过在它上面使用反编译器,它只给我一些没有意义的java代码。

提前谢谢!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

Scala编译为JVM字节码,该字节码与Java相同。除非反编译器明确地将Scala定位为目标,否则反编译为Java才有意义。

为补充Alexey Romanov回答(对于Scala 2仍然有效)中的信息,我想补充一点,由于Scala 3(又名Dotty,其开发名称),Scala首先编译为中间表示形式TASTy (它将“类型化抽象语法”树信息添加到已编译的类文件中,因此也就是名称)。

您可以在this interesting talk at 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选项将其反馈到(de)编译器中,如下所示:

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")
}

您可以按照here的说明开始使用Dotty,并执行与Dotty 0.27.0-RC1相同的实验。