2015-04-21 205 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' –