2009-10-12 11 views
15

多くの場合、ソースのないJavaクラスファイルが残っています。私が手元に持っている問題を理解しようとしています。Javaバイトコードを理解する

逆コンパイラが便利が、すべての状況では十分ではないことに注意してください...

私は(Linuxのコマンドラインから、好ましく利用可能)Javaバイトコードを表示するにはどんなツールがあります2つの質問

  1. を持っていますこれワット

答えて

16

Javaバイトコードの構文に精通しているというよりもJavaバイトコードを直接見得るための良い参考文献どのようなものがあり、 Java仮想マシンとその操作に精通している必要がある場合、Java逆コンパイルユーティリティを使用しようとする可能性があります。逆コンパイラは、classファイルからjavaソースファイルを作成しようとします。

How do I “decompile” Java class files?は、Java classファイルを逆コンパイルする方法を調べるのに有益な関連する質問です。

つまり、Java classファイルを逆アセンブルするためには、JDKの一部であるjavapコマンドを使用できます。 javapの出力は、classファイルに含まれるJavaバイトコードになります。しかし、バイトコードがJavaソースコードにまったく似ていないことに注意してください。

JavaバイトコードとJava仮想マシンについて学習するための明確なソースは、The Java Virtual Machine Specification, Second Editionです。特に、Chapter 6: The Java Virtual Machine Instruction Setはすべてのバイトコード命令のインデックスを有する。あなたは、クラスなしのソースコードを持っていますが、あなたはバグを持っている場合は

+0

逆コンパイラに関する私のコメントを参照してください。 – hhafez

+0

@hhafez:「Javaバイトコードを理解する」の答えはありますか? –

1

、次の2つの基本的な事柄の1行うことができます。

  1. 逆コンパイル、バグを修正し、jarファイルを再作成します。私は以前これをしていましたが、システム管理者はそれを生産に移すことに注意しています。
  2. クラスの単体テストを記述し、バグの原因を特定し、単体テストのバグを報告し、それが修正されるまで待ちます。

    (2)は、通常、私の経験上、システム管理者が好むものです。

    その間に、バグの原因を知っているので、その入力をクラスに移したり、問題を回避したり、適切に対処できるようにすることはできませんエラーが発生したとき。

    AspectJを使用して、問題クラスにコードを注入し、実際に再コンパイルすることなくメソッドの動作を変更することもできます。私はこれが望ましいオプションかもしれないと思います。関数を呼び出す可能性があるすべてのコードに対して変更することができます。問題を誰にでも教えることを心配する必要はありません。

    バイトコードの説明を読むことを学ぶ場合は、問題を解決するために何をしますか?

+0

1.私はあなたが.classにコードを挿入するためにAspectJを使うことができないことを知りました。私はそれがJavaで動作すると思っていましたが、間違っていると思います。何度もあなたの問題を解決するためにそこにある問題を実際に見つけ出す – hhafez

+0

@hhafez - アスペクトをクラスにランタイムウィービングすることはできますが、そのときにライセンスに違反する可能性があります。単体テストが最善の策かもしれませんが、コードがテスト可能でなければ、逆コンパイルはオプションになりますが、遅いプロセスであるIMOです。 –

0

私はjavapツール(とLinuxのコマンドラインから 好ましく利用できる(Javaバイトコードを表示するにはどんなツールがあります2つの質問

1))

を持っています-cオプション)は、バイトコードファイルを逆アセンブルします。これはコマンドラインから実行され、Java SDKの一部として提供されます。

Javaバイトコードの構文に慣れるための良い参照ですjavapツールは、JVM仕様で使用されているのと同じ構文を使用して、JVMの仕様は自然に決定的なソースです何

2) 。私はBill Vennersの "Java仮想マシンの内部"にも注目しました。私はそれを読んだことがないし、それは絶版かもしれないように見える。

実際の(テキスト)構文は単純で自明です...バイトコードが何をしているのかを説明し、このレベルでコードを読むことに中程度の知識があると仮定していると仮定します。しかし、たとえバイトコードが難読化装置を介して供給されたとしても、デコンパイラの出力を読む方が簡単になる可能性があります。

14

クラスファイルのバイトコード命令を表示するには、Javaプログラムを実行し、クラスパス(必要な場合)とクラス名を指定するのと同じ方法でjavap -vコマンドを使用します。

例:

javap -v com.company.package.MainClass 

バイトコード命令セットについて、 Instruction Set Summary

+1

この回答は、元の質問の両方の側面を完全にカバーしています。 – CyberMJ

2

Fernflowerは、分析逆コンパイラなので、代わりにバイトコードの読み込み可能なJavaコードにクラスをコンパイルします。コードがどのように動作するかを理解したいときには、はるかに便利です。

0

あなたは便利なEclipseプラグインのバイトコードの概要を見つけるかもしれない:

http://andrei.gmxhome.de/bytecode/index.html

私はそれを自分自身を使用していない - ちょうどそれが通過中で言及見。

関連する問題