クラスをロードしようとしたときに JVM が失敗したことを示す ClassNotFound 例外が頻繁に発生します。 この例外を解決するには、次のことを知っておく必要があります
Tomcat が Web アプリケーションでサーブレットをロードして管理する方法について考えてみましょう。 JVM クラスローダーJava クラスのロードとは、バイトコード形式の .class ファイルを JVM のメソッド領域にロードし、JVM ヒープ内に java.lang.Class オブジェクト インスタンスを作成して、Java クラスに関連するデータとメソッドをカプセル化することです。 クラスオブジェクトとは何ですか? JVM は起動時にすべての .class ファイルをロードするのではなく、プログラムが動作中に使用されるときにのみクラスをロードします。 パブリック抽象クラス ClassLoader { //各クラスローダーには親ローダーがあります private final ClassLoader parent; パブリッククラス<?> loadClass(文字列名) { // クラスがロードされているかどうかを確認します Class<?> c = findLoadedClass(name); // ロードされていない場合 if( c == null ){ // [再帰] 親ローダーにロードを委任する if (parent != null) { クラス名をロードします。 } それ以外 { // 親ローダーが空の場合は、Bootstrap ローダーがロードされているかどうかを確認します c = findBootstrapClassOrNull(name); } } // 親ローダーがロードに失敗した場合は、独自のfindClassを呼び出してロードします。if (c == null) { クラス名を検索します。 } c を返します。 } 保護されたクラス<?> findClass(文字列名){ // 1. 渡されたクラス名に従って、特定のディレクトリ内のクラス ファイルを検索し、.class ファイルをメモリに読み込みます... // 2. defineClass を呼び出してバイト配列を Class オブジェクトに変換します。 return defineClass(buf, off, len); } // バイトコード配列をクラスオブジェクトに解析し、ネイティブメソッドで実装します。protected final Class<?> defineClass(byte[] b, int off, int len){ ... } } JVM のクラス ローダーは階層的な親子関係を持ち、各クラス ローダーは親ローダーを指す親フィールドを保持します。
loadClass は、まずクラスがロードされているかどうかを確認します。ロードされている場合は直接戻り、ロードされていない場合は親ローダーに渡してロードします。 JDK クラス ローダーの動作原理は同じですが、唯一の違いはロード パス、つまり findClass によって検索されるパスが異なります。 クラス ローダーの親子関係は継承を通じて実装されません。たとえば、AppClassLoader は ExtClassLoader のサブクラスではありませんが、AppClassLoader の親は ExtClassLoader オブジェクトを指します。 Tomcat クラスローダーTomcat のカスタム クラス ローダー WebAppClassLoader は親の委任メカニズムを破壊します。 クラスを検索パブリック Class<?> findClass(String name) は ClassNotFoundException をスローします { ... クラス<?> clazz = null; 試す { //1. まず、Web アプリケーション ディレクトリでクラスを検索します。clazz = findClassInternal(name); } キャッチ (RuntimeException e) { eを投げる; } (clazz == null)の場合{ 試す { //2. ローカル ディレクトリで見つからない場合は、親ローダーで検索させます。clazz = super.findClass(name); } キャッチ (RuntimeException e) { eを投げる; } //3. 親クラスが見つからない場合は、ClassNotFoundException をスローします。 (clazz == null)の場合{ 新しい ClassNotFoundException(名前) をスローします。 } 戻りクラッズ; } ワークフロー
ロードクラスパブリック Class<?> loadClass(String name, boolean resolve) は ClassNotFoundException をスローします { 同期化 (getClassLoadingLock(名前)) { クラス<?> clazz = null; //1. まず、ローカル キャッシュでクラスがロードされているかどうかを確認します。clazz = findLoadedClass0(name); (clazz != null)の場合{ もし(解決する) クラスを解決します(clazz); 戻りクラッズ; } //2. システム クラス ローダーがロードされているかどうかを確認します clazz = findLoadedClass(name); (clazz != null)の場合{ もし(解決する) クラスを解決します(clazz); 戻りクラッズ; } // 3. ExtClassLoader クラス ローダーを使用してクラスをロードしようとしますが、なぜでしょうか? クラスローダー javaseLoader = getJavaseClassLoader(); 試す { clazz = javaseLoader.loadClass(名前); (clazz != null)の場合{ もし(解決する) クラスを解決します(clazz); 戻りクラッズ; } } キャッチ (ClassNotFoundException e) { // 無視する } // 4. ローカルディレクトリでクラスを検索してロードしてみる try { clazz = findClass(名前); (clazz != null)の場合{ もし(解決する) クラスを解決します(clazz); 戻りクラッズ; } } キャッチ (ClassNotFoundException e) { // 無視する } // 5. システムクラスローダー(AppClassLoader)を使用してロードを試みる try { clazz = Class.forName(名前、false、親); (clazz != null)の場合{ もし(解決する) クラスを解決します(clazz); 戻りクラッズ; } } キャッチ (ClassNotFoundException e) { // 無視する } } //6. 上記のプロセスはすべてロードに失敗し、例外をスローします。throw new ClassNotFoundException(name); } ワークフロー
Tomcat クラス ローダーは親の委任を破棄し、最初は親ローダーに直接委任せず、最初にローカル ディレクトリにロードすることがわかります。 Tomcat が親委任メカニズムを破壊する仕組みについての記事はこれで終わりです。Tomcat の親委任メカニズムの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: CSS のサイズと幅と高さのブラウザ解釈の違いに対する解決策
HTMLのdivブロックを使用していて、ブロックの中央をしっかりと接続できず、解決できない場合1. ...
忘れてしまった場合に後で戻って確認できるようにメモしておいてください。問題の説明:今日はちょっとした...
中国語ドキュメント: https://router.vuejs.org/zh/ Vue Router...
色はあらゆるウェブサイトにとって最も重要な要素の 1 つであり、閲覧者に大きな影響を与えるため、色の...
[LeetCode] 184. 部門最高給与従業員テーブルにはすべての従業員が保存されます。すべて...
テストプロジェクト: react-demo react-demo プロジェクトをサーバーにクローンし...
MySQL自体は再帰構文をサポートしていませんが、自己接続を通じていくつかの単純な再帰を実現できます...
ウェブページに403 Forbiddenと表示されるNginx (yum インストール ログは通常 ...
1. なぜこの記事を書くのですか?重複リクエストの処理に関する記事をたくさん読んだことがあるでしょう...
シングルページアプリケーションを開発する場合、特定のルートを入力し、パラメータに基づいてサーバーから...
nginx をリバース プロキシとして使用する場合、リクエストをそのまま次のサービスに転送するだけで...
Centos6.5にmysql5.7.19をインストールするための詳細な手順は次のとおりです。 1....
概要インデックスは、テーブル内の 1 つ以上の列に基づいて DBMS によって特定の順序で作成される...
1. MySQLをダウンロードする1.1 ダウンロードアドレスhttps://downloads.m...
MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明itemcontractprice ...