2015-04-21 4 views
1

Comment puis-je désassembler le code Scala? Peut-il être fait sans d'abord construire le Jar et décompiler les fichiers .class qui en résultent? Existe-t-il une alternative, un moyen plus rapide de le faire?Désassemblage Scala code

Pour Python, il est dis qui peut être utilisé comme suit:

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 

Répondre

5

Vous savez que vous pouvez le faire dans le 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  
... 

Vous avez ramper un peu à travers la sortie, car il contient le module externe et beaucoup plus d'informations.

+1

La syntaxe ': javap # foo' fonctionne dans ce cas. Si vous avez 'C' avec le membre' c', alors 'C# c'. –

+0

Un grand merci! Cela va me faire gagner beaucoup de temps. Pour tous ceux qui luttent avec 'javap' dans la Scala REPL (j'avais l'avertissement': javap indisponible sur ce système'), assurez-vous d'avoir la dernière version installée. J'ai eu la version 2.9.2 et n'a même pas ajouté 'tools.jar' au classpath travaillé. Cela a été corrigé dans les versions ultérieures. A partir de maintenant j'ai la version 2.11.6 installée. –

+0

Vous pouvez aussi faire 'def greet() =" hello "' puis ': javap greet' –