【问题标题】:Extract scala source code from jar从jar中提取scala源代码
【发布时间】:2020-12-31 15:18:48
【问题描述】:

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

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

提前谢谢你!

【问题讨论】:

  • 我也有同样的问题

标签: java scala jar decompiler scalac


【解决方案1】:

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

【讨论】:

  • 这在 2018 年仍然有效吗?
  • @kaqqao 是的,据我所知。 (除了现在写反编译器会更复杂,至少如果你想同时支持 Scala 2.12 和以前的版本的话。)
【解决方案2】:

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 会产生预期的输出(Main 类的 .class 文件,Main 对象的一个​​和 .tasty 文件),可以反馈到 (de )编译器带有-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")
}

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

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 2017-01-26
    • 2017-06-21
    • 2011-04-04
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2016-04-03
    相关资源
    最近更新 更多