Java 从jar中提取scala源代码

Java 从jar中提取scala源代码,java,scala,jar,decompiler,scalac,Java,Scala,Jar,Decompiler,Scalac,因此,我有一个jar文件,其中包含scala作为源代码,我丢失了原始代码。有没有办法将jar中的类文件转换为scala函数和类,而不是编译器生成的java类 我曾尝试在它上面使用反编译器,但它只给了我一段毫无意义的java代码 提前谢谢你 您需要一个特定于Scala的反编译器。没有理由不写一个,但这将是一个巨大的努力,据我所知,没有人真正做到这一点。当然,它不会像其他语言的反编译器那样生成完全相同的原始代码。Scala编译成JVM字节码,它与Java的编译目标相同。除非反编译器明确地以Scala

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

我曾尝试在它上面使用反编译器,但它只给了我一段毫无意义的java代码


提前谢谢你

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

Scala编译成JVM字节码,它与Java的编译目标相同。除非反编译器明确地以Scala为目标,否则反编译到Java是有意义的

为了补充Alexey Romanov的答案中的信息(该答案对Scala 2仍然有效),我想补充一点,因为Scala 3(也称为Dotty,它的开发名称),Scala首先编译成一个中间表示形式,TASTy(它将类型化的抽象语法树信息添加到编译的类文件中——因此得名)

您可以在中看到有关TASTy及其在编译器管道中的角色的演示

正如演讲中提到的,Dotty提供了反编译编译输出的可能性(TASTy+类文件)

作为一个简单的实验,让我们在文件<代码>主体中考虑这个非常简单的程序。Scala < /C> >:

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

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

我有一个相同的问题2018年是否仍然存在此问题?@Kaqao是的,据我所知。(除非现在编写反编译器会更复杂,至少如果您想同时支持Scala 2.12和以前的版本。)