22- namespace analyse approfondie du chargeur de classe et étude de cas

analyse de la classe Namespace de profondeur du chargeur et étude de cas

relation Namespace différents chargeur de classes:

  • Les classes dans le même espace de noms sont mutuellement visibles.
  • namespace namespace enfant chargeur contient tous le chargeur de classe parent. Ainsi, par le sous-chargé par les charges de chargeur de classe, vous pouvez voir la classe parente. Par exemple, le chargeur de classe système pour charger une classe peut voir le chargeur de classe racine pour charger une classe.
  • Chargé par le chargeur de classe ne peut pas voir les charges de chargeur de classe parent-enfant.
  • S'il n'y a pas de relation parent-enfant direct ou indirect entre les deux chargeurs, ils sont chaque classe chargée ne soit pas visible à l'autre.

Exemple un:

public class MyPerson {
    private MyPerson myPerson;
    public void setMyPerson(Object object) {
        this.myPerson = (MyPerson)object;
    }
}

public class MyTest20 {
    public static void main(String[] args) throws Exception {
        //MyTest16是一个自定义类加载器
        MyTest16 loader1 = new MyTest16("loader1");
        MyTest16 loader2 = new MyTest16("loader2");

        Class<?> clazz1 = loader1.loadClass("Jvm.MyPerson");
        Class<?> clazz2 = loader2.loadClass("Jvm.MyPerson");

        System.out.println(clazz1==clazz2);

        Object object1 = clazz1.newInstance();
        Object object2 = clazz2.newInstance();

        Method method = clazz1.getMethod("setMyPerson",Object.class);
        method.invoke(object1,object2);
    }
}
运行结果:
	true
  • Tout d'abord, imprimer le résultat est: System.out.println (clazz1 == clazz2), à la charge parce que loader1, loader2 à la charge myPerson lorsque les parents sont commandés par le mécanisme pour demander son chargeur de classe parent pour la première fois loader1 demande chargeur de classe parent (le chargeur de classes de système) pour terminer le chargement; loader2 lorsque la deuxième charge, la demande de chargeur de classe parent (classe de système de chargeur) pour charger trouvés myPerson a été chargé, il ne sera plus rechargé , le résultat peut être chargé directement en arrière.

Exemple 2:

//前提:删除out文件夹中的MyPerson.class,并将其复制到桌面上去。
public class MyTest21 {
    public static void main(String[] args) throws Exception {
        MyTest16 loader1 = new MyTest16("loader1");
        MyTest16 loader2 = new MyTest16("loader2");
        loader1.setPath("C:\\Users\\admin\\Desktop\\");
        loader2.setPath("C:\\Users\\admin\\Desktop\\");
        Class<?> clazz1 = loader1.loadClass("Jvm.MyPerson");
        Class<?> clazz2 = loader2.loadClass("Jvm.MyPerson");

        System.out.println(clazz1==clazz2);

        Object object1 = clazz1.newInstance();
        Object object2 = clazz2.newInstance();

        Method method = clazz1.getMethod("setMyPerson",Object.class);
        method.invoke(object1,object2);
    }
}
运行结果:
   findClass invoked:Jvm.MyPerson
   class loader name:loader1
   findClass invoked:Jvm.MyPerson
   class loader name:loader2
   -------------------
   false
   Exception in thread "main" java.lang.reflect.InvocationTargetException
   Caused by: java.lang.ClassCastException: Jvm.MyPerson cannot be cast to Jvm.MyPerson
  • La raison de la fausse: ** S'il n'y a pas directe ou indirecte relation parent-enfant entre deux chargeurs, ils sont chaque classe chargée ne soit pas visible à l'autre. ** et ainsi loader2 loader1 sont deux chargeurs de classes différentes (des chargeurs de classe ont différents espaces de noms, cependant, les deux espaces de noms différents ont la même myPerson de classe).
Publié 25 articles originaux · louanges gagnées 0 · Vues 1451

Je suppose que tu aimes

Origine blog.csdn.net/qq_40574305/article/details/104793474
conseillé
Classement