Java-Classloader-loadeClass(String,boolean)、findClass(String)クラスロードソース解析

3726 ワード

ここではクラスロードの手順をよりよく説明するために、サブコードの一部を削除し、興味があればClassloderソースコードを自分で表示することができます.
まず、クラス・ロードの手順を簡単に説明します.
  • findLoadedClass(name)メソッドを使用して、クラスが
  • ロードされているかどうかを確認します.
  • クラスがロードされていない場合は、拡張クラスローダ
  • である親ローダが呼び出される.
  • 拡張クラス・ローダは、親ローダが存在することがブート・クラス・ローダであるため、loadClassメソッドを実行する際にも、親ブート・クラス・ローダにロードを委任して
  • を実行するClassLoaderクラスを継承します.
  • がブートクラスローダの番になったとき、それはローダの最高レベルであり、親がいないため、彼は自身、すなわちブートクラスローダのクラスローダ方法
  • を呼び出す.
  • ブートクラスがロードできない場合は、階層的に後退し、拡張クラスローダに渡されます.同様に、拡張クラスローダがロードできない場合は、アプリケーションクラスローダクラスに渡され、ロードできない場合は、最終的にはユーザー定義クラスローダに戻ってユーザー書き換えのfindClass(String)メソッド
  • を実行します.
    したがって、ユーザーがクラスローダをカスタマイズするときは、loadClassメソッドではなくfindClassメソッドを書き換える必要があります.
    protected Class> loadClass(String name, boolean resolve)
                throws ClassNotFoundException
            {
                //              
                synchronized (getClassLoadingLock(name)) {
                    //           
                    Class> c = findLoadedClass(name);
                    //       
                    if (c == null) {
                        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
                            //                
                            c = findClass(name);
                        }
                    }
                    //           ,          
                    if (resolve) {
                        resolveClass(c);
                    }
                    return c;
                }
            }
        //                   java.lang.ClassLoader      
        //     loadClass(String,boolean)    
        protected Class> findClass(String name) throws ClassNotFoundException {
            throw new ClassNotFoundException(name);
        }