2015-04-21 160 views
1

如何反汇编Scala代码?如果不先构建Jar并反编译得到的.class文件,可以这样做吗?有没有其他更快的方法来做到这一点?反汇编Scala代码

对于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 

回答

5

你知道你可以在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'适用于这种情况。如果你有'C'成员'c',那么'C#c'。 –

+0

非常感谢!这将为我节省很多时间。对于任何在Scala REPL中用'javap'挣扎的人(我有警告':javap在这个系统上不可用),一定要安装最新版本。我的版本是2.9.2,甚至没有将'tools.jar'添加到工作的类路径中。这已在更高版本中得到修复。截至目前,我已安装版本2.11.6。 –

+0

你也可以'def greet()=“hello”'然后':javap greet' –