コンパイルされたjava .classファイルのレイアウトに影響する設定は何ですか?コンパイルされた2つのクラスが等しいかどうかはどうすればわかりますか?

StackOverflow https://stackoverflow.com/questions/644320

質問

組み込みのEclipse" Compile"でコンパイルされたアプリがあります。仕事。次に、ビルド手順をAntの javac に移動することにしました。結果は小さなファイルになりました。

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

デバッグ情報のほかに、2つのおそらく等しいファイルが異なる内部レイアウトまたはサイズを取得する理由は何ですか?

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

役に立ちましたか?

解決

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

コンパイル済みのクラスを比較できますが、クラスファイル構造を掘り下げて解析する必要があります。 BCEL ASM ですが、あなたがやりたいことを支援してくれるかどうかは100%わかりません。

他のヒント

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

重要なことは、Eclipseはjavacを使用しないことです。 Eclipseには独自のコンパイラー JDT があるため、結果の。クラスファイルは私を驚かせません。それらは異なるコンパイラであるため、逐語的ではないと期待しています。

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

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

とにかくそれをしたいのですか?

ミカレBが言ったように、それは任意です。

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

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

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

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top