クラスにはいくつかのインポートステートメントがあります。バイトコードがそのクラスに対して生成されると、これらのインポート文はどうなりますか?インポートステートメントバイトコードの意味
実行時にインポートステートメントが無視される場合、実行時にそのクラスメソッドの依存関係はどのように解決されますか。
クラスにはいくつかのインポートステートメントがあります。バイトコードがそのクラスに対して生成されると、これらのインポート文はどうなりますか?インポートステートメントバイトコードの意味
実行時にインポートステートメントが無視される場合、実行時にそのクラスメソッドの依存関係はどのように解決されますか。
インポートステートメントの目的は、コードの人間の読者(および作成者)の生活を楽にすることです。したがって、バイトコード内の完全修飾クラス/メソッド名への参照に置き換えられます。また、未使用のインポート文は無視されます。あなたがjava.util.*
をインポートする場合、あなたのコード内でjava.util.ArrayList
を記述する必要はありませんが、ArrayList
輸入はただ速記
ですあなたのコードで無制限にアクセスできるクラス名(または静的メソッド名)(つまり、の代わりにfoo.bar.MyClass
)を知っています。その背後では、完全に修飾されたクラス名に解決するためだけに使用され、バイトコードでも同様に使用されます。
自分で見つけてみませんか?クラスのいくつかのバリエーションを書く:外部クラスに依存するもの、依存するもの(例えば、インポートによって 'java.util.List')、' List'に頼っているものの、完全なものを使用するもの)。そして、それぞれに 'javap -c'を使い、何が出てくるのかを見てください。 – yshavit
@yshavitコメントと相補的に、コンパイル時に、 '.class'ファイル内のデバッグ情報(例えば行番号)を生成しないために' javac -g:none Foo.java'を使用し、生成された '.class'esバイトレベルでは同じになり、それぞれのハッシュを取得することでテストできます。 –