1

SVN には通常の Java ファイルがあります。これらのファイルにいくつかの変更を加えましたが、これらのファイルが失われることがあります (SVN にはありません)。しかし、新しく変更されたファイルを使用して生成されたクラス ファイルがあります。

クラス ファイルを使用して逆コンパイルし、SVN と比較できますか。それを行う最も簡単な方法は何ですか?

約 400 の変更されたファイルがあります。したがって、1つずつ比較することは現実的ではありません。

ツールやスクリプトを探しています。

また、フォルダー全体を一度に逆コンパイルする逆コンパイラーはありますか?

ありがとう

4

6 に答える 6

8

逆コンパイルには、最も一般的に使用されるツールであるJADを使用します。比較は少し難しいですが。次のシナリオを提案します。

  1. SVN から最新のソース コードを入手する
  2. 構築する
  3. 逆コンパイル(!)
  4. いくつかの変更を含むコンパイル済みのクラスを取得しますが、ソースはありません
  5. それらも逆コンパイルします
  6. 両方の逆コンパイルされたソース ディレクトリを比較します

元のソース コードをコンパイルおよび逆コンパイルする理由 JAD はかなり良い結果を生成しますが、使用したものとまったく同じソースを生成することは決してないためです。したがって、元のソースと逆コンパイルされたものを比較する際の頭痛の種を避けたい (そして実際の違いをすばやく特定したい) 場合は、元のソースと合成 JAD 出力ではなく、2 つの JAD 出力を比較する必要があります。

2 つのディレクトリ構造を比較することが問題にならないことを願っています。Windows ではTotal Commanderを、Linux では次のようなさまざまなユーティリティ/スクリプトを使用できます。

$ diff -r dir1 dir2
于 2011-06-06T08:47:55.607 に答える
2

以下のコマンド (jad decompiler) を使用して、フォルダー内のすべてのクラス ファイルを一度にコンパイルしました。

             jad -o -r -sjava -dsrc tree/**/*.class 
于 2011-06-06T11:21:44.703 に答える
2

jadはフォルダー全体を逆コンパイルできますが、結果はいくつかの要因によって異なります。まず、JAD は Java 4 しかサポートしていません。Java 5 以降には、JAD が理解できなかった奇妙なバイト コード チャンクが含まれます。

コードがデバッグ シンボルを使用してコンパイルされている場合、行番号を再調整できます ( jadclipseプラグインで実行できます) が、JAD 自体では実行できません。

でコードをコンパイルした場合-g:source、クラス ファイルには完全なソース コードが含まれます。一見すると、これを取得する方法がわかりませんが、javap(JDK に付属している) やASMなどのツールを使用すると取得できるはずです。

于 2011-06-06T08:46:23.110 に答える
2

クラス ファイルの生成時に難読化を使用していなければ、逆コンパイルされたソース ファイルを元のファイルと比較することができます。ただし、コンパイラの最適化などにより、逆コンパイルされたソースは元のソースとわずかに異なることが多いため、自動比較は困難です。個人的にはjadを逆コンパイラとして使用していますが、フォルダ全体を一度に提供できるかどうかはわかりません。

于 2011-06-06T08:45:28.990 に答える
1

非常に優れた逆コンパイラであるjd-guiを使用しますが、比較は...苦痛になります。

于 2011-06-06T08:43:03.617 に答える
0

現在、http://java.decompiler.free.fr/を使用して逆コンパイルし、比較 ( http://www.scootersoftware.com/ ) を使用してパッケージとファイルを比較しています。どのファイル (およびどのセクション) が最新であるかを確認するために、コンパイルおよび逆コンパイルされた実際のバージョン (svn) とすばやく比較することは素晴らしいアイデアのようです。

于 2012-03-07T12:48:13.923 に答える