2

Web アプリケーションと 2 つのクラス ファイルがあります。

最初のクラスはabc.jarファイル (WEB-INF/lib/abc.jar)内にあるMyClass.classで、2 番目のクラスはクラス フォルダー (WEB-INF/classes/ YourClass.class) 内にある YourClass.class です。

私の質問は、アプリケーションの起動時に最初にロードされるクラスはどれですか? なぜ ?

4

4 に答える 4

9

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

テストランナー(MavenのSurefireのようなもの)を作成し、同じJVMとOSを使用して、異なるマシンで実行すると異なる順序でクラスをロードしたことがあります。学んだ教訓:

クラスのロード順序に依存するようにアプリケーションを構築しないでください

于 2009-05-24T17:41:00.440 に答える
5

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

于 2009-05-24T17:48:48.833 に答える
3

Sun のクラス ローダーのドキュメントでは、常に WEB-INF/classes または WEB-INF/lib と記載されていますが、どちらが最初にチェックされるかは記載されていません。

IBM ドキュメントから:

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

したがって、答えは次のとおりだと思います。アプリケーションで最初にどのクラスが必要かによって異なります。

于 2009-05-24T17:36:53.673 に答える
1

ダフィーモが指摘するように、これはさまざまです。この特定のアプリのシーケンスを確認する 1 つの方法は、Response.Write テキストをクラス コンストラクターと Web Web アプリ ページの読み込みメソッドに挿入することです。「クラス A のインスタンス化されたオブジェクト」、「Web ページ MyPage を開いた」など。

シーケンスを把握したら、それらのコードをコメントアウトして、後でそれらを再利用して、シーケンスに影響する変更 (以前または後でオブジェクトをインスタンス化するなど) を行っていないことを確認できるようにします。

于 2009-05-24T17:42:24.353 に答える