看到网上这么说:
双亲委派机制描述
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
首先将加载任务委托给父类加载器,依次递归 这句话的意思是所有类都是由Object类的记载器加载的吗?
大家讲道理2017-04-18 10:50:25
Java 仮想マシンの最初のクラス ローダーはブートストラップです。このローダーは Java 仮想マシン カーネルにネストされており、C++ で書かれたバイナリ コードです。
委任メカニズムを使用すると、親クラスが再帰的に検索されます。つまり、ブートストラップを使用してロードを試行し、見つからない場合はダウンすることをお勧めします。バイトコードの 2 つのコピーがメモリ内に出現しないようにします。
クラスとクラスローダーを誤解しています。
クラスが記録されるときは、まず現在のスレッドのクラスローダーを使用して、スレッド内の最初のクラスをロードします。たとえば、このクラスは ClassA で、クラスローダーは ClassLoaderA です。
ClassA が ClassB を参照する場合、システムは ClassLoaderA を使用して ClassB をロードします。現在 2 つのクラスがあります (
簡易版、実際には 2 つ以上のクラス)。
ClassX と ClassY がメモリにロードされており、両方とも ClassZ を参照している状況を考えます。では、誰が ClassZ をロードするのでしょうか。明らかに、上記のロード手順によれば、ClassZ の 2 つのコピーが表示されます。ClassX は 1 回ロードされ、ClassY は再度ロードされます。 ClassY は ClassX がロードされたことを知らないためです。
この問題を解決するには、親クラスを再帰的に検索します。
具体的な手順は、まず BootstrapClassLoader から検索し、BootstrapClassLoader がこのクラスをロードしていない場合は、そのクラスを返します。このクラスが見つかるまで検索を続けます。このスレッドのクラス ローダーが見つからない場合は、クラスがロードされていないことを意味し、現在のスレッドのローダーを使用してクラスがロードされます。
を使用して、現在のスレッドのクラスローダーを取得できます。 getContextClassLoader()
高洛峰2017-04-18 10:50:25
Java には、システム クラス ローダーとユーザー定義クラス ローダーの 2 種類のクラス ローダーがあります。
システム クラス ローダーには、JDK1.6 の ブートストラップ クラス ローダー
など、System.getProperty("sun.boot.class.path") code>クラスロードパスを取得できます
Bootstrap Class Loader
在JDK1.6下,通过System.getProperty("sun.boot.class.path")
可以得到类加载路径
JAVA_HOME\jre6\lib\resources.jar;
JAVA_HOME\Java\jre6\lib\rt.jar;
JAVA_HOME\jre6\lib\sunrsasign.jar;
JAVA_HOME\jre6\lib\jsse.jar;JAVA_HOME\jre6\lib\jce.jar;
JAVA_HOME\jre6\lib\charsets.jar;
JAVA_HOME\jre6\lib\modules\jdk.boot.jar;
JAVA_HOME\jre6\classes
这些路径下的class是由Bootstrap
负责,其它路径下的class的递归到Bootstrap
リーリー
Bootstrap
によって処理され、他のパスのクラスが Bootstrap
に再帰され、クラス ファイルが見つからない場合は、次のパスでロードされます。サーバーは、対応するパスに移動してロードします。 🎜