2016-03-22 9 views
3

は、私は私のコンパイルされたクラスを表示するように頼んだときjavapで示したコード生成です(私はメソッドを選択)のjavaてjavapとグルーヴィーなバイトコードの比較

int multiply(int, int); 
    flags: 
    Code: 
    stack=2, locals=3, args_size=3 
     0: iload_1 
     1: iload_2 
     2: imul 
     3: ireturn 
    LineNumberTable: 
     line 2: 0 
    LocalVariableTable: 
     Start Length Slot Name Signature 
      0  4  0 this LMyClass; 
      0  4  1  a I 
      0  4  2  b I 

ここgroovyConsoleによって表示されるコード、(同じ方法があります)

public multiply(II)I 
    L0 
    LINENUMBER 4 L0 
    ILOAD 1 
    ILOAD 2 
    IMUL 
    IRETURN 
    L1 
    LDC 0 
    IRETURN 
    LOCALVARIABLE this LMyClass; L0 L1 0 
    LOCALVARIABLE a I L0 L1 1 
    LOCALVARIABLE b I L0 L1 2 
    MAXSTACK = 2 
    MAXLOCALS = 3 

ただし、どのバイトコードがrawですか?私が理解する限り、javapはそれにスタイルを追加しました。そのため、2番目の例はより本物のものになるはずですbytecode。 私はそうですか?

答えて

2

いずれも未加工です。まったく同じ情報を提示するには2通りの方法があります。

+0

'class'ファイルと同じように表示するのがより正確で、すべてのアセンブラで判断するのが第2の変種です。 – lapots

+0

.classファイルにはバイナリデータが含まれています。このため、これらの表現のいずれも、クラスファイルに格納されているのと同じ方法でデータを表示しません。 – yole

0

JavapとGroovyの両方が甘いことをしているように見えますが、さまざまな点で違いがあるように見えます。たとえば、Groovyには、Javapが糖化している生のメソッド・ディスクリプタ(II)Iが表示されますが、Javapはスタックとローカル・カウントを表示し、Groovyは表示しません。

と言われていますが、どちらも特に「生」ではありません。 JavapはJavaのデバッグに役立つように設計されています。そのため、出力をJavaのようにするために、非表示または書き直そうとするものが数多くあります。これは、異常な、または悪意を持って構築されたクラスファイルをまったく処理するようには設計されていません。

最も「生の」分解出力が必要な場合は、Krakatau disassemblerが最適です。 Krakatauは、Java以外のクラスファイルや悪意のあるクラスファイルを含む、任意のクラスファイル内のすべての小さな詳細を表現できる唯一の逆アセンブラです。