by shigemk2

当面は技術的なことしか書かない

javapのオプションの違いがよく分からなかった

どーも。違いのわからない男、shigemk2です。例にもれず、javapのオプションの違いがあまり良く分からなかったので、あれこれ手を動かしながら調べてみました。

javap - Java クラスファイル逆アセンブラ

-cオプション

クラスの各メソッドのために逆アセンブルされるコード、すなわち Java バイトコードから成る命令を表示します。

-vオプション

別名--verbose

メソッドのスタックサイズ、および locals と args の数を出力します。

-pオプション

たぶん別名--private

その違い

manでも上のドキュメントでもまあ情報は手に入るけど、オプションcとvの違いがよく分からなかったので比べてみた。

サンプルコード

gist.github.com

オプションなし

逆アセンブル結果も何もない味気ないコード。 gist.github.com

-pだけ

逆アセンブル結果は何もないけど、とりあえずprivateメソッドが追加されてる。 gist.github.com

-cだけ

どうも、privateメソッドの逆アセンブルはできていない様子。 gist.github.com

-vだけ

メソッドのスタックサイズ、および locals と args の数を出力します、と書いてあるけど、何気に逆アセンブル結果も出ている。だけでなく、まえがきや定数プールも出力されている。なお、privateメソッドの逆アセンブル結果は出てない。

gist.github.com

-cと-p

cオプションで出てきた逆アセンブル結果に加えて、privateメソッドの逆アセンブル結果も、出る。でも定数プールとかは出ない。

gist.github.com

-pと-v

vオプション単体にprivateメソッドの逆アセンブル結果などが出てくる。

gist.github.com

-cと-v

vオプション単体と変わらない。。

gist.github.com

-cと-pと-v

pオプション+vオプションと変わらない。

gist.github.com

まとめ

微妙な違いがわかったので、とりあえず、pとvを基本で使いつつ、要所要所でcだけを使うといいと思いました。cとvを重ねがけするのは意味がないのでした。