Java クラスパスは JVM 起動後に確定しますか? 質問する

Java クラスパスは JVM 起動後に確定しますか? 質問する

最近、Java クラスのロード プロセスについてたくさん読んでいます。実行時にクラスをクラスパスに追加して、クラス ローダー ハッキング (URLClassLoaders など) なしでロードすることはできないという内容の文章によく出くわします。

私の知る限り、クラスは動的にロードされます。つまり、バイトコード表現は必要な場合にのみロードされ、java.lang.Class オブジェクトに変換されます。

では、JVM の起動後に JAR または *.class ファイルをクラスパスに追加して、まだロードされていない場合はそれらのクラスをロードすることはできないのでしょうか? (明確に言うと、この場合、クラスパスは単にファイルシステム上のフォルダーです。「JAR または *.class ファイルを追加する」とは、単にそれらをこのフォルダーにドロップすることを意味します。)

そうでない場合、JVM の起動時にクラスパスが検索され、見つかったクラスの完全修飾名がすべて内部の「リスト」にキャッシュされることを意味しますか?

回答の中で、いくつかの情報源を示していただけるとありがたいです。できれば、公式の SUN ドキュメントが望ましいです。Sun JVM 仕様仕様を読みましたが、クラスパスとそれが JVM の起動時に確定されるかどうかについては何も見つかりませんでした。

追伸

これは理論的な質問です。それが可能かどうか知りたいだけです。達成したい実用的なものは何もありません。ただ知識欲が強いだけです :)

ベストアンサー1

ここでは、クラスパスとクラスパス内のクラス ファイルという 2 つの概念が混在しています。

クラスパスをディレクトリに指定すると、通常、ディレクトリにファイルを追加して、クラスパスの一部として取得するのに問題はありません。クラスパス内のすべてのクラスのサイズが大きい可能性があるため、最新の JVM が起動時にそれらをすべてロードすることは実際には現実的ではありません。ただし、Jar ファイルは含まれないため、これは限られた価値しかありません。

ただし、実行中の JVM でクラスパス自体 (どのディレクトリ、jar などが検索されるか) を変更することは、実装に大きく依存します。私の知る限り、標準の Sun JVM では、これを実行するための文書化された (つまり動作が保証されている) 方法は存在しません。

一般に、これを実行する必要がある場合 (実行時に変更される動的なクラスパスを持つ)、クラスをアンロードする必要がある場合に、クラスを破棄して、それらのクラスを参照しない新しいクラスを作成できるようにするためだけでも、ClassLoader を実装する必要があります。

ただし、少量の動的ロードの場合は、よりよい方法があります。Java 1.6 では、ディレクトリ (*.jar) 内のすべての jar ファイルを指定できるため、追加のライブラリを指定された場所に配置するようにユーザーに指示できます (ただし、起動時にその場所にある必要があります)。

また、必要なくても、オプションの jar ファイルまたはリソース ファイル (ログ構成ファイルなど) を配置するためのプレースホルダーとして、jar ファイルまたはその他の場所をクラスパスに含めることもできます。

しかし、本格的な動的クラスロード、特にアプリケーションの実行中にアンロードする必要がある場合は、Classloader の実装が必要です。

おすすめ記事