所以我有一个包含scala作为源代码的jar文件,我丢失了原始代码。有没有办法将jar中的类文件转换为scala函数和类而不是编译器生成的java类?
我试过在它上面使用反编译器,它只给我一些没有意义的java代码。
提前谢谢!
答案 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相同的实验。