Exploration 1: Comment "nouveau" un objet
Exemple: créer une instance de voiture via une nouvelle
Le fichier de classe est chargé dans la machine virtuelle JVM par ClassLoader et le fichier de classe de voiture est initialisé en même temps,
Ce fichier est un modèle de l'instance Car et toutes les instances sont créées sur la base de ce modèle.
Ainsi, lorsque nous utilisons le mot-clé "new" pour créer un objet, nous obtenons en fait une copie de "Car Class".
Exploration 2: mécanisme de délégation parentale
Quatre chargeurs
Afficher le code source sous idée pour comprendre le processus d'exécution
ctrl + N , recherchez ClassLoader , puis sélectionnez la classe sous java.lang
Après être entré dans la classe, ctrl + F , recherchez 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;
}
}
Processus de chargement de classe
La figure est de haut en bas, à gauche puis exécutée
Mécanisme de délégation parentale
1. Empêchez le chargement répété du même .class
. Posez la question ci-dessus en confiant. Une fois chargé, il n'est pas nécessaire de le charger à nouveau. Assurer la sécurité des données.
2. Assurez-vous que le noyau .class
ne peut pas être altéré. Grâce à la méthode de délégation, le noyau ne sera pas falsifié .clas
, même s'il est falsifié, il ne sera pas chargé, et même s'il est chargé, ce ne sera pas le même .class
objet. Différents chargeurs chargent le même objet et .class
pas le même Class
objet. Cela garantit la Class
sécurité d'exécution.
L'isolement du bac à sable est l'objectif et la délégation parentale est la réalisation.
Il n'est pas difficile de voir sur cette image que les classes sous des packages tels que java, javax et sun (tels que java.lang.Object, java.lang.String, etc.) sont toutes chargées par le chargeur de classe de démarrage, nous are Ces classes n'ont pas besoin d'être empaquetées, et si nous créons des classes avec le même nom sous le même chemin, elles ne peuvent pas être chargées.
++++++++++++++++++++++++++++++++++++
+ Si vous avez des questions, s'il vous plaît + Q: 1602701980 discutez ensemble +
++++ ++++++++++++++++++++++++++++++++