クラスファイル内の変数名と機械的な変数名の違いについて

このQ&Aのポイント
  • クラスファイル内の変数名と機械的な変数名の違いについて調査しました。
  • 2つのclassファイルを逆コンパイルしてみたところ、変数名の違いが見つかりました。
  • コンパイル方法の違いによって、変数名が機械的になってしまうことがあるようです。
回答を見る
  • ベストアンサー

classファイル内の変数名について

2つのclassファイルをそれぞれ逆コンパイルして内容を確認したところ、 以下のように、それらしい変数名と機械的に振られたような変数名になっていました。 ・A.class → A.java  String atai = "aaa"; ← 元のプログラムと同じ変数名(atai)   ・B.class → B.java  Stinrg s1 = "aaa"; ← 機械的に振られている変数名(s1) コンパイル方法の違いで変数名が機械的になってしまうことがあるのでしょうか。 作業担当者が居なくなってしまって、当時の状況を確認することができません。 多分、同じソースファイルのはずなのですが、本当に同じ内容なのか 比較したいのに、微妙な違いがあるため比較ができなくて困っています。 引数も微妙に違っているようなので、それらしい変数名か機械的なものか どちらかに統一させてデコンパイルする方法があったら教えてください。 また原因も知りたいです。 アドバイスをお願いします。

  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1619/5654)
回答No.1

>コンパイル方法の違いで変数名が機械的になってしまうことがあるのでしょうか。 あります。 メソッドのローカル変数は変数名を保持しておく必要性がありませんから、 コンパイル時に-gオプションを指定しないとなくなります。

komegu66
質問者

お礼

ありがとうございます。 確かに-g オプションで内容が変わりました。 今回はclass 同士で比較をしたかったので、これだと比較はできなさそうですね。 残念です。

その他の回答 (1)

  • _kappe_
  • ベストアンサー率68% (1522/2216)
回答No.2

ローカル変数とフィールドの違いではないでしょうか。 下記のようなクラスがあった場合、intLocalはclassファイルの中に名前が残らず、intFieldはコンパイル後も名前が保存されると思います。 public class Test { private int intField; public void setInt(int intLocal) { intField = intLocal; } }

komegu66
質問者

お礼

ありがとうございます。 確かに-g オプションで内容が変わりました。 今回はclass 同士で比較をしたかったので、これだと比較はできなさそうですね。 残念です。

関連するQ&A

  • jadによるclassファイルの逆コンパイル後の比較

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

  • classファイル

    プログラムを書いて、コマンドプロンプト上でコンパイルとしたところエラーが表示されたのですが、.javaとかかれたソースファイルのあるフォルダに.classというファイルが出来るのはなぜですか?エラーが発生したのでコンパイルは失敗したのですが。お願いします。

    • ベストアンサー
    • Java
  • カスタムタグでclassという引数名を使用しちゃダメ?

    java開発で非常に困っております。 開発環境:Eclipse3.1、Tomcat 4.1、j2sdk1.4.0_01 訳あってjspのコンパイルはbuild.jspc.xmlなるものを用意して 自分でコンパイル実行などを行っております。(保存⇒コンパイルみたいな自動じゃないって事です。) ただ、その際にjava形式へコンパイル出来るものと、出来ないjspファイルが存在しました。 その違いを突き詰めていくとあるカスタムタグで異変が起きているようです。 以下のカスタムタグを書いたjspファイルがコンパイルできないようです。 カスタムタグ:<customTag:caption class="default"> 理由としては引数名に"class"という名称を使っているからだと思われるのです。 (ネット上で調査した結果を自分で思い込んで判断しているだけですが。。) コンパイル出来ないのは、「classという名称が悪い」というのは何パーセント程あるのでしょうか? また、引数名classをどうにかしてコンパイルできる方法などはあるのでしょうか? どうかご教授ください。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaのソースとclassファイルの単位について

    最近JAVAの勉強を始めました。 基礎的なことで恐縮ですが、JAVAのコンパイル単位を知りたいのですが。 一つの*.javaファイルについては、必ず一つのclassファイルができるんでしょうか? 一つの*.javaファイルから、複数個のclassファイルができたり、複数の*.javaファイルから 一つのclassファイルができたりはしないんでしょうか? まだ、一つの*.javaから一つのclassファイルを作ったことしかないので、 申し訳ないですが、どなたか教えてください。よろしくお願いします。

    • ベストアンサー
    • Java
  • classファイルを元に戻す

    javaを勉強しているものなんですが、 一度コンパイルをしてできたclassファイルから もとのソースファイルを取り出す(元に戻す)ことは できるのでしょうか? なんとなく気になったもので。誰かお願いします!!!!

    • ベストアンサー
    • Java
  • classが作られない

    javaをはじめて2日目です。以下がコンパイルしたところ、エラーがでなかったのですが、classが作られていません。何回か試したのですが、参考書には、 >javac Sample2.java とし、もう一度ディレクトリ名が出れば、コンパイル完了とあるのですが、classが作れていないので、実行が出来ません。 すみませんが、教えてください。 //画面に文字を出力するコード class Sample1 { public static void main(String args[]) { System.out.println("ようこそjavaへ!"); System.out.println("javaをはじめましょう!"); } } ちなみに保存名は、Sample2.javaです。

    • ベストアンサー
    • Java
  • classファイルの取り扱い方

    クラスファイルをnewをしてから関数を呼び出す場合と クラス名::関数名で呼び出す場合だとパフォーマンスやメモリの負担などの違いは在りますでしょうか? また、独自のpublic function関数のみのファイル(lib.php)をclassで囲ってあるのですが、 実際はincludeして扱うので、classで囲わなくても問題はないと思うのですが、どこのクラスにあるのかという目安として囲っています。 上記のファイル関数を呼び出す場合に 1.newをしてから$クラス変数->関数名(); 2.それともクラス名::関数名(); 3.そもそもclassで囲わないで、関数名();のみ コーディングルールがないのでどれが一般的なのかが分かりません。 教えて下さい。

    • ベストアンサー
    • PHP
  • Classファイル → Javaソースプログラム

    どーも、こんにちは。プログラミング初心者です。 現在Javaを使ってプログラムをしています。 JavaはJavaソースをコンパイルするとClassファイルが生成されるじゃないですか? では逆に、ClassファイルからもとのJavaソースプログラムに変換する(?)、取り戻すことはできないのでしょうか??? もしかして無理なのかもしれませんが、これが出来ないとどうしていいか分かりません。 どうしても、ソースプログラムが見たいClassファイルがあるのです。 そんな状態なので困っています。 どなたか少しでもご存知の方は、ご一報ヨロシクお願いします!!

    • ベストアンサー
    • Java
  • 環境変数がおかしいのでしょうか?

    現在家のパソコンを使いJavaの勉強をしております。 家で使用しているパソコンとは違うのにj2sdk1.4.2_01をインストールして勉強しようと考えていました。 それで、J2SDK1.4.2_01をインストールしてユーザーの環境変数に以下のようなものを新規で作りました。 JAVA_HOME C:\j2sdk1.4.2_01 PATH %JAVA_HOME%\bin CLASSPATH .;%JAVA_HOME%\lib\tools.jar それで家で作ったjavaファイル、classファイルをインストールしたパソコンにコピーしました。 実際に正しく設定されているか確認するため、javaファイルのあるディレクトリに移動し javac Sample.java (作ったjavaファイルをSample.javaとした場合) とコマンドしたところ 「'javac'は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。」 と表示されました。 家のパソコンと同じようにしたのにおかしいと思い、一応classファイルもコピーしたので java Sample とタイプし実行してみました。 そうすると実行はできたんです。 なぜコンパイルはできなかったんでしょうか? 環境変数の設定がおかしいのでしょうか?

    • ベストアンサー
    • Java
  • コンパイルした後 java (classファイルの名前) が実行できない

    すみません。本当につまらない質問かもしれませんが コンパイルまではDOS窓でできるんですが。できたCLASS ファイルを java (できたclassファイル名) を実行しよう としても、 Exception in thread "main" java.lang.NoClassDefFoundError: (できたファイルの名前) と表示されてしまい、まったく実行できません。 これはどうしたら実行できるのでしょうか? なお、最新版のSDKとJava 2 Runtime Environmentはインストールしています。 どうかお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう