dポイントプレゼントキャンペーン実施中!

classファイルを逆コンパイル(jadを使用)して内容の比較を試みたのですが、
片方はテキトウな変数名になっていて、
  String s1 = "0";
片方は実際にソースに書かれたと思われる変数名になっています。
  String nflg = "0";
これは、javacのバージョンの違い、もしくは -targetオプションの指定の
違いによるものなのでしょうか。
実際は等価な内容であるのにも関わらず、テキスト比較ではうまく比較できなくて悩んでいます。このような場合に、うまく比較する方法はありますか?

もし、コンパイルに使用されたjavacのバージョンの違いによるものならば、
片方だけはソースがあるので、バージョンを合わせ再コンパイル→逆コンパイル→比較
ということができそうだと思っていますが、classファイルから、コンパイルに
使用されたされたjavacのバージョンを取得することはできるのでしょうか?

A 回答 (1件)

javacのバージョンをコンパイルされたクラスから取得する方法はないと思われます。



変数名ですが、コンパイラの最適化によりローカル変数の場合は
情報が失われるため適当につけられます。
メンバー変数であれば情報は保持されるため
保持された変数名が使用されます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
クラスファイルからはバージョンは取得できなさそうですね。

例示させていただいたのは、同じ位置で宣言されている
ローカル変数同志ですが、何故違いが生じるのでしょうか。-targetによるものかと違いかと思い、何通りか
試しましたが、全て同じバイナリになってしまいました。
(バージョン依存の処理がないからかもしれませんが)。

また、片方は
for(..){
 if(xxx){
  yyyy();
 }else{
  zzzz();
 }
}
となって、もう一方は
for(..){
 if(xxx){
  yyyy();
  continue;
 }
 if(!xxx){
  zzzz();
 }
}
となったりもします。

処理そのものが等価であるかを比較したいのに、
このような違いが出てくるので純粋な差異がわかり
にくくて困ってしまいます。ファイルが小さければ
問題ないのですが…

お礼日時:2005/08/19 23:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!