拆解Scala代码

3

如何反编译Scala代码? 可以不先构建Jar文件并反编译生成的.class文件吗?有没有其他更快捷的方法来实现这一点?

对于Python,可以使用dis命令,用法如下:

def myfunc(alist):
    return len(alist)

>>> dis.dis(myfunc)
  2           0 LOAD_GLOBAL              0 (len)
              3 LOAD_FAST                0 (alist)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE
1个回答

8

您知道在REPL中可以这样做:

scala> def foo[A](xs: Seq[A]) = xs.size
foo: [A](xs: Seq[A])Int

scala> :javap foo
  Size 714 bytes
...
public <A extends java/lang/Object> int foo(scala.collection.Seq<A>);
  flags: ACC_PUBLIC
  Code:
    stack=1, locals=2, args_size=2
     0: aload_1       
     1: invokeinterface #20, 1 // InterfaceMethod scala/collection/Seq.size:()I
     6: ireturn       
...

由于输出包含外部模块和更多信息,因此您需要浏览一下。


1
语法 :javap #foo 适用于此情况。如果您有成员为 cC,则为 C#c - som-snytt
非常感谢!这将为我节省很多时间。对于在Scala REPL中遇到javap问题的任何人(我收到了警告“:javap在此系统上不可用”),请确保安装最新版本。我之前使用的是2.9.2版本,即使将tools.jar添加到类路径中也无法解决问题。这个问题已经在后来的版本中得到了修复。目前我已经安装了2.11.6版本。 - Alper Turan
你也可以只需编写 def greet() = "hello" 然后输入 :javap greet - Alper Turan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接