2009-05-24 8 views
2

私は、Webアプリケーションの起動時に最初に読み込まれるクラスはどれですか?

ファーストクラスをWebアプリケーションと2つのクラスファイルを持っているがabc.jarファイル(WEB-INF/libに/ abc.jar)の内側にあり、 セカンドクラスがYOURCLASSあるMyClass.classです.classは、クラスフォルダ(WEB-INF/classes/YourClass.class)の内部にあります。

私の質問は、アプリケーションの起動時に最初に読み込まれるクラスですか?なぜ ?

答えて

9

私の経験では、クラスがJVMによってロードされる順序を予測することはできません。

一度テストランナー(Maven's Surefire)を作成し、同じJVMとOSを使用すると、別のマシンで実行したときにクラスが異なる順序でロードされました。レッスンは学んだ:

あなたはduffymoが指摘するように、これは変えることができ、クラスのロード順

+3

+1 - よく書かれた優れたポイントです。 – duffymo

3

Sunのclass loader docsは、常にWEB-INF/classesまたはWEB-INF/libと言っていますが、最初にチェックされるものはありません。 IBM docsから

「クラスをロードするためのルールがJVM仕様の詳細に綴られている基本的な原理はが(あるいは、少なくとも、ロードされたように見える必要なときクラスが唯一ロードされているということです。この方法では、JVMは実際のロードにある程度の柔軟性を持ちますが、クラス初期化の固定シーケンスを維持する必要があります)ロードされる各クラスは依存する他のクラスを持つ可能性があり、ロードプロセスは再帰的です。

私は答えが次のようだと思います。まずアプリケーションに必要なクラスによって異なります。

1

に依存するようにアプリケーション を構築するべきではありません。この特定のアプリケーションのシーケンスを確認する方法の1つは、Response.WriteテキストをクラスコンストラクタとWebアプリケーションページの読み込みメソッドに挿入することです。 「クラスAのインスタンス化されたオブジェクト」、「開いたWebページMyPage」など。

シーケンスを見つけたら、後で再利用して、シーケンスに影響を与える変更(以前または後でオブジェクトをインスタンス化するなど)が行われていないことを確認するためにコードをコメントアウトします。

5

「必要な」という定義のために、クラスは必要に応じてロードされます。クラスがロードされるときは、JREの実装、javacの実装、正確にはスレッドの種類、サーバーコード、そしてアプリケーションコードに依存します。この分野での仮定を立てることは悪い考えです。特定の実行で何が起こるかを確認したい場合は、-verbose:class

関連する問題