JVMクラス親委任モデルのロード

2062 ワード

親委任モデル
≪ワーク・プロシージャ|Work Procedure|emdw≫:クラス・ローダがクラス・ローディングのリクエストを受信した場合、まずこのリクエストを親のクラス・ローダに委任して完了します.各階層のクラス・ローダはそうです.そのため、すべてのロード・リクエストは最上位の起動クラス・ローダに転送する必要があります.親ローダがこのロード要求を完了できないとフィードバックした場合(検索範囲に必要なクラスが見つからない場合)、サブローダは自分でロードしようとします.
メリット:javaクラスは、クラスローダとともに優先度のある階層関係を備えています.例えばクラスjava.lang.Object.はrt.jarに格納され、どのクラス・ローダがこのクラスをロードするにしても、最終的には起動クラス・ローダにロードされるため、Objectクラスはプログラムの様々なクラス・ローダ環境で同じクラスになります.逆に、ユーザーがjavaという名前を自分で書いた場合.lang.Objectのクラスが、プログラムのClasspathに置かれると、システムには複数の異なるObjectクラスが現れ、javaタイプのシステムで最も基礎的な動作も保証されず、アプリケーションも混乱します.
コード:
    protected Class> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }