2009-03-13 5 views
4

ビルドインのEclipseの「コンパイル」タスクでコンパイルされたアプリがあります。その後、ビルド手順をAntのjavacに移すことにしました。結果は小さくなりました。コンパイル済みの.classファイルのレイアウトにはどのような設定が影響しますか? 2つのコンパイルされたクラスが等しいかどうかをどのように判断できますか?

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

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

コンパイル済み.classファイルを比較するにはどうすればよいですか?

答えて

3

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

コンパイル済みのクラスを比較することはできますが、クラスファイル構造を調べて解析する必要があります。 BCELASMのようなことをするライブラリーがありますが、私が100%彼らがあなたのやりたいことを手伝ってくれると確信していません。

1

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

どうしてあなたはそれをやりたいのですか?

+0

興味深い。好奇心から、学習のために。私はそれが私が本当に頼りにすべきではないことを知っています。 –

0

Eclipseはデバッガでの実行を支援するためにいくつかの計測を行っていますか?

+0

私はそれをやっているのか分かりません。それをどのように確認できますか? –

0

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

1

ミハイルBが言ったように、それは任意であってもよい。

セキュリティとしてファイルサイズを使用しているシステムで動作します。 .classファイルのサイズが変更された場合、そのクラスには特定のアクセス権が与えられません。

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

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

別のこと - ファイルをコンパイルするときに特殊なキー番号が生成されます。私はこれについてあまりよく分かりませんが、クラスが一緒に働くことを妨げることがよくあります。私は、手順は、クラスAをコンパイルし、それを保存する(a1と呼ぶ)と信じています。クラスaを再度コンパイルします(a2)。クラスa2に対してクラスbをコンパイルします。 a1に対してbを実行してみてください。私はこの場合、実行時に失敗すると信じています。

あなたがそのキー番号についてもっと知ることができれば、それはあなたの後の情報を与えるかもしれません。

1

あなたのクラスファイルを逆コンパイルし、生成されたソースで再生することができます。 thisを参照してください。

2

ASM Eclipse pluginには、バイトコード比較機能があります。 2つのクラスを選択し、右クリックし、[各バイトコードとの比較]を行います。

2

重要なことは、Eclipseはjavacを使用しないことです。 Eclipseには独自のコンパイラ、the JDTがありますので、結果の.classファイルの違いは私を驚かせません。私はそれらが異なったコンパイラであるため、それらを逐語的ではないと思います。

違いのため、javacでコンパイルするコードは存在しますが、JDTではコンパイルできません。その逆もあります。一般的に私は、ジェネリック医薬品の多量使用の場合に、2つの違いが明らかになることを見てきました。

関連する問題