探索1:オブジェクトを「新しい」方法
例:newを使用してCarインスタンスを作成する
クラスファイルはClassLoaderによってJVM仮想マシンにロードされ、同時にCarClassファイルが初期化されます。
このファイルはCarインスタンスのテンプレートであり、すべてのインスタンスはこのテンプレートに基づいて作成されます。
したがって、「new」キーワードを使用してオブジェクトを作成すると、実際には「CarClass」のコピーが取得されます。
調査2:親の委任メカニズム
4つのローダー
実行プロセスを理解するためにアイデアの下でソースコードを表示する
ctrl + N、ClassLoaderを検索し、java.langの下のクラスを選択します
クラス(ctrl + F)を入力した後、loadClassを検索します
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// 首先检查这个classsh是否已经加载过了
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
// c==null表示没有加载,如果有父类的加载器则让父类加载器加载
if (parent != null) {
c = parent.loadClass(name, false);
} else {
//如果父类的加载器为空 则说明递归到bootStrapClassloader了
//bootStrapClassloader比较特殊无法通过get获取
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {}
if (c == null) {
//如果bootstrapClassLoader 仍然没有加载过,则递归回来,尝试自己去加载class
long t1 = System.nanoTime();
c = findClass(name);
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
クラスの読み込みプロセス
フィギュアは上下、左、そして実行されます
親の委任メカニズム
1.同じものが繰り返しロードされないようにし.class
ます。委託して上記を依頼してください。一度ロードすると、再度ロードする必要はありません。データのセキュリティを確保します。
2.コア.class
が改ざんされていないことを確認します。委任方式により、コアが改ざんされることはなく、改ざんされて.clas
もロードされず、ロードされても同じ.class
オブジェクトにはなりません。異なるローダーは、同じオブジェクトで.class
はなく同じClass
オブジェクトをロードします。これにより、Class
実行の安全性が保証されます。
サンドボックスの分離が目標であり、親の委任が実現です。
この図から、java、javax、sunなどのパッケージ(java.lang.Object、java.lang.Stringなど)の下のクラスがすべてスタートアップクラスローダーによってロードされていることがわかります。これらのクラスはパッケージ化する必要はなく、同じパスで同じ名前のクラスを作成すると、ロードできません。
++++++++++++++++++++++++++++++++++++
+ご不明な点がございましたら、+ Q:1602701980で話し合ってください。 +
++++ ++++++++++++++++++++++++++++++++