多くの場合、ソースのない Java クラス ファイルで立ち往生しており、手元にある問題を理解しようとしています。
逆コンパイラは便利ですが、すべての状況で十分ではないことに注意してください...
2つ質問があります
- Javaバイトコードを表示するために利用できるツールは何ですか(できればLinuxコマンドラインから利用できます)
- Java バイトコード構文に慣れるための参考資料は何ですか
Java 仮想マシンとその操作に精通している必要がある Java バイトコードを直接見るのではなく、Java 逆コンパイル ユーティリティを使用してみてください。java
逆コンパイラは、指定されたファイルからソース ファイルを作成しようとしclass
ます。
Java クラス ファイルを「逆コンパイル」するにはどうすればよいですか? class
Javaファイルを逆コンパイルする方法を見つけるのに役立つ関連する質問です。
つまりjavap
、JDK の一部であるコマンドを使用して、Javaclass
ファイルを逆アセンブルすることができます。の出力はjavap
、ファイルに含まれる Java バイトコードになりclass
ます。ただし、バイトコードは Java ソース コードとはまったく似ていないことに注意してください。
Java バイトコードと Java 仮想マシン自体について学ぶための明確な情報源は、The Java Virtual Machine Specification, Second Editionです。特に、Chapter 6: The Java Virtual Machine Instruction Setには、すべてのバイトコード命令のインデックスがあります。
クラス ファイルのバイトコード命令を表示するには、javap -v
クラスパス (必要な場合) とクラス名を指定して、Java プログラムを実行する場合と同じ方法でコマンドを使用します。
例:
javap -v com.company.package.MainClass
バイトコード命令セットについて、 命令セットまとめ
Fernflowerは分析的逆コンパイラであるため、クラスをバイトコードではなく読み取り可能な Java コードに逆コンパイルします。コードがどのように機能するかを理解したい場合は、はるかに便利です。
クラスはあるがソース コードはなく、バグがある場合は、次の 2 つの基本的なことのいずれかを行うことができます。
クラスの単体テストを作成し、バグの原因を特定し、単体テストでバグを報告し、修正されるのを待ちます。
(2)は、私の経験では、一般的にシステム管理者が好むものです。
(2) を使用する場合は、その間、バグの原因がわかっているため、その入力をクラスに渡さないようにするか、問題を回避するか、エラーが発生したときに適切に処理できるように準備することができます。 .
AspectJ を使用してコードを問題のクラスに挿入し、実際に再コンパイルせずにメソッドの動作を変更することもできます。問題について全員に教えることを心配することなく、関数を呼び出す可能性のあるすべてのコードに対して変更できるため、これは好ましいオプションであると思います。
バイトコード命令を読めるようになったら、問題を解決するために何をしますか?
2つ質問があります
1) Java バイト コードを表示するために使用できるツール (Linux コマンド ラインから使用できることが望ましい)
このjavap
ツール (-c オプションを使用) は、バイトコード ファイルを逆アセンブルします。これはコマンド ラインから実行され、Java SDK の一部として提供されます。
2) Java バイトコード構文に慣れるための参考資料は何ですか?
このjavap
ツールは、JVM 仕様で使用されているのと同じ構文を使用しており、JVM 仕様は当然、決定的なソースです。また、Bill Venners による「Inside the Java Virtual Machine」も見つけました。私は読んだことがなく、絶版のようです。
実際の (テキスト) 構文は単純で自明です... バイトコードが何をするかを説明するリファレンスがあり、このレベルのコードを読むことにある程度慣れていると仮定します。ただし、バイトコードが難読化ツールを介して供給された場合でも、逆コンパイラの出力を読み取る方が簡単である可能性があります。
Eclipse Byte Code Outline プラグインが役立つ場合があります。
http://andrei.gmxhome.de/bytecode/index.html
私はそれを自分で使用したことはありません。