4

組み込みの Eclipse の「コンパイル」タスクでコンパイルされたアプリがあります。次に、ビルド プロシージャを Ant の に移動することにしましjavacた。その結果、ファイルが小さくなりました。

後で、debuglevel を"vars,lines,source"に調整すると、Eclipse と同じデバッグ情報を埋め込むことができることがわかりました。多くの場合、ファイルはまったく同じサイズのままでしたが、内部レイアウトは異なっていました。その結果、md5sum 署名を使用して、それらがまったく同じバージョンであるかどうかを判断できませんでした。

デバッグ情報以外に、等しいと思われる 2 つのファイルの内部レイアウトまたはサイズが異なる理由は何ですか?

また、コンパイルされた .class ファイルをどのように比較できますか?

4

8 に答える 8

3

各フィールド/メソッド/クラスの属性だけでなく、定数プール エントリ (基本的にはすべてのシンボル情報) の順序などに必要な順序はありません。さまざまなコンパイラが、好きな順序で自由に書き出すことができます。

コンパイルされたクラスを比較することはできますが、クラス ファイルの構造を掘り下げて解析する必要があります。BCELASMなど、それを行うためのライブラリがありますが、それらがあなたがやりたいことを支援してくれるとは 100% 確信が持てません。

于 2009-03-13T20:41:54.423 に答える
2

注意すべき重要なことは、Eclipse は javac を使用しないということです。Eclipse には独自のコンパイラーである JDTがあるため、生成される .class ファイルの違いは驚くことではありません。それらは異なるコンパイラであるため、逐語的ではないことを期待しています。

それらの違いにより、javac ではコンパイルできても JDT ではコンパイルできないコードが存在し、その逆もあります。通常、ジェネリックを多用する場合、2つの違いが明らかになるのを見てきました

于 2009-03-13T22:19:43.783 に答える
2

ASM Eclipseプラグインには、バイトコード コンペアラーが含まれています。2 つのクラスを選択して右クリックし、Compare With / Each Other Bytecode を実行します。

于 2009-03-13T22:02:20.610 に答える
1

比較のために、クラス ファイルを逆コンパイルし、生成されたソースで遊ぶことができます。これを参照してください。

于 2009-03-13T20:56:43.717 に答える
1

最も重要なことは、コードのセマンティクスを変更することなく、ローカル変数のスタック スロットを任意に配置できることです。したがって、基本的に、コンパイルされたクラス ファイルを解析および正規化せずに比較することはできません。かなりの労力が必要です。

そもそも、なぜそれをしたいのですか?

于 2009-03-13T20:08:47.407 に答える
1

ミケーレ B が言ったように、それは恣意的である可能性があります。

ファイルサイズをセキュリティとして使用しているシステムに取り組んでいます。.class ファイルのサイズが変わると、クラスに特定の権限が与えられなくなります。

通常は簡単に回避できますが、環境をかなり完全に制御できるため、実際には非常に機能的です。

とにかく、監視されているクラスが再コンパイルされるたびに、サイズを再計算する必要があるようです。

もう 1 つ、ファイルのコンパイル時に特別なキー番号が生成されます。これについてはよくわかりませんが、クラスが連携できなくなることがよくあります。手順は、クラスAをコンパイルして保存すると思います(a1と呼びます)。クラス a を再度コンパイルします (a2)。クラス a2 に対してクラス b をコンパイルします。a1 に対して b を実行してみてください。この場合、実行時に失敗すると思います。

そのキー番号について詳しく知ることができれば、求めている情報が得られるかもしれません。

于 2009-03-13T20:45:59.377 に答える
0

Eclipse は、デバッガーでの実行を支援するために何らかのインストルメンテーションを行っていますか?

于 2009-03-13T20:10:12.503 に答える
0

最終的には、使用されている構成がおそらく違いを生んでいます。同じバージョンの Java を使用していると仮定すると、コンパイル構成に使用できるオプションが多数あります (JDK 準拠、クラス ファイルの互換性、デバッグ情報オプションのホスト)。

于 2009-03-13T20:12:00.987 に答える