Chargement d'une classe à deux reprises dans la JVM à l'aide de différents chargeurs
J'ai une question au sujet de concepts de chargement de classe. Comment charger une .fichier de classe deux fois dans la JVM. Je suis également à l'écriture d'un extrait de code que j'ai écrit pour accomplir cette..
1) Chargeur 1 code
public class MyClassLoader extends ClassLoader {
public MyClassLoader(){
super(MyClassLoader.class.getClassLoader());
}
public Class loadClass(String classname){
try {
return super.loadClass(classname);
} catch (ClassNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
2) Chargeur 2 code
public class AnotherClassLoader extends ClassLoader {
public AnotherClassLoader(){
super(AnotherClassLoader.class.getClassLoader());
}
public Class loadClass(String classname){
try {
return super.loadClass(classname);
} catch (ClassNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
3) Maintenant, je suis le chargement d'une classe nommée en utilisant deux différents chargeurs de classe. Je suppose que l'opération classA1==newClassA doit retourner false. Voici le code:
public static void main(String[] args) {
MyClassLoader loader1 = new MyClassLoader();
AnotherClassLoader newLoader = new AnotherClassLoader();
System.out.println("Load with Custom Class Loader instance");
Class classA1 = loader1.loadClass("com.hitesh.coreJava.A");
System.out.println("Class Loader:::"+classA1.getClassLoader());
Class newClassA = newLoader.loadClass("com.hitesh.coreJava.A");
System.out.println("Class Loader:::"+newClassA.getClassLoader());
System.out.println(classA1==newClassA);
System.out.println(classA1.hashCode() + " , " + newClassA.hashCode());
}
4) Résultat de l'exécution de code ci-dessus:
Charge avec Classe Personnalisée occurrence de Loader
Chargeur de classe:::soleil.misc.Lanceur$AppClassLoader@11b86e7
Chargeur de classe:::soleil.misc.Lanceur$AppClassLoader@11b86e7
vrai
1641745 , 1641745
Pourriez-vous m'expliquer ce
OriginalL'auteur Hitesh | 2013-01-10
Vous devez vous connecter pour publier un commentaire.
Essayer cette
sortie
Mais les initialiseurs statiques (s'il est placé à l'intérieur de Test1) sera exécuté qu'une seule fois. Si la classe est chargé (et plus tard initialisé) deux fois, de ne pas les initialiseurs statiques être exécuté deux fois?
OriginalL'auteur Evgeniy Dorofeev
Deux chargeurs de classes de commencer la recherche dans leur chargeur de classe parent (c'est ce que l'
super()
appel est d'environ). Donc en fait le super chargeur de classe des charges dans les deux cas.Vous pouvez essayer ceci:
Assurez-vous que
my.jar
n'est PAS sur votre classpath.OriginalL'auteur gaborsch
Dans les deux cas, vous utilisez le même chargeur de classe pour effectuer le chargement. Vous avez deux chargeurs de classes, mais chaque appelez simplement super.loadClass() qui délègue à la même chargeur de classe parent qui est AppClassLoader.
OriginalL'auteur Peter Lawrey