私が得られないのは、参照されているjarのメソッドをJavaがどのように知っているかということです? 実行するためだけにコンパイルされていて、それを読むことができない場合、メソッドがまだどのように表示されるかわかりません。私の質問の例は、「ShowABox」というメソッドを使用して画面にボックスを表示するjarを作成した場合のようなものです。そして、それを別の Java プロジェクトに追加します。次に、jar が既にコンパイルされているため、IDE は「ShowABox」というメソッドが存在することをどのように認識しますか? IDE ではクラス ファイルを読み取ることができないのに、なぜメソッドを読み取ることができるのでしょうか?
5 に答える
あなたが参照しているすべての情報は、まさにこの理由でクラスファイルに実際に保存されています。
クラスファイルのコードを見ることに関しては、確かにそうすることができ、情報が保持されていたことも証明されます。Java Decompilerを見てください。そこで直接見たい場合は、これをEclipseに組み込むこともできます。
コンパイルされたクラスにはバイトコードが含まれています。メソッドにはまだ実際の名前がありますが、そのコードは JVM 命令にコンパイルされます。
wiki で Java クラス ファイル形式の仕様を読むことができます。「定数プール」の段落を読むと、(他のクラス情報として) メソッド名が定数プールに含まれます。
テキスト エディタで .class ファイルを開こうとすると、そこにメソッド名が表示されます。(.class ファイルは多くの場合、project/bin フォルダーにあるか、.jar をアーカイブとして開き、そこから .class ファイルを取得します)
JAR は、マニフェストが添付された単一のファイルに圧縮されたすべてのクラス ファイルにすぎません。各クラス ファイルには、そのパブリック インターフェイスが完全に記述されています。
jar は、コンパクトさのために 1 つのファイルに圧縮された Java コンパイル済み .class バイナリを含むアーカイブに他なりません。その内容は、ディレクトリ構造に編成されたコンパイル済みバイナリです。したがって、これはファイルを含むディレクトリであると考えることができますが、単一のアーカイブに圧縮されています (zip ファイルのように)。jar 自体はバイナリではありません (「jar が既にコンパイルされているため存在します」)。それ自体はコンパイルされませんが、コンパイルされた要素が含まれています。
JAR ファイルには非常に特殊な形式があります — http://en.wikipedia.org/wiki/JAR_(file_format)を参照してください— また、非常に特殊な形式を持つクラス ファイルが含まれています — http://en.wikipediaを参照してください.org/wiki/Java_class_file . このフォーマットは、Java 仮想マシンがコードを実行するために必要な情報を提供するだけでなく、クラス、インターフェース、フィールド、メソッドなどを見つけるために必要な情報を IDE およびコンパイラーに提供します。