Cet article étudie principalement le contenu lié à l'analyse des instances de chargeur de classe personnalisées dans la langue Java, comme suit.
Le chargeur de classe que j'ai écrit
Il convient de noter que si vous souhaitez tester cette instance, vous devez d'abord créer un répertoire C: // Myjava sur le lecteur C. Mettez ensuite le fichier Java correspondant dans ce répertoire. Et mettez le fichier .clas généré dans le répertoire c: //myjava/com/lg.test, sinon il ne sera pas trouvé. C'est quelque chose à qui il faut prêter attention. .
Classe FileClassloadher:
package com.lg.test; import java.io.bytearrayoutputStream; import java.io.fileInputStream; import java.io.ioexception; import java.io.inputStream; / ** * créé par 2016/8/6. * / public class fileClassloader étend classloadher {string rootdir = null; public fileclassloader (string rootdir) {this.rootdir = rootdir;} @ override protected class <?> findClass (String classname) lance classnotfoundException {// Vérifiez d'abord qu'il ait été chargé. Class <?> C = findloadELDClass (className); String path = rootdir + "/" + classname.replace ('. {return c;} else {/ * Si cela ne fonctionne pas, chargez à nouveau. Parce que l'essence de bytecode est un tableau d'octet * / inputStream est = null; bytearRayOutputStream outputStream = new bytearrayoutputStream (); try {is = new fileInputStream (path); byte [] buffer = new byte [1024]; int len = 0; while (len = is.read (tampon)! = -1) {OutputStream.Write (Buffer, 0, Len);} c = Deficlass (classname, tampon, 0, buffer.length);} c = définieclass (classname, tampon, 0, buffer.length);} c (exception e) {e.printStackTrace ();} Enfin {if! = NULL) {essai {est.);););) (IoException e) {e.printStackTrace ();}}}} return c;}}}}}Démo de classe:
package com.lg.test; / ** * créé par 2016/8/6. * // * Le même chargeur de classe charge la même classe, et le Hascode est le même. Différents chargeurs de classe chargent la même classe et le Hascode est différent. */public class Demo {public static void main(String[] args) {FileClassLoader loader = new FileClassLoader("c://myjava");FileClassLoader loader2=new FileClassLoader("c://myjava");try {Class<?> c = lourder.findClass ("com.lg.test.helloworld"); classe <?> c0 = loder.findclass ("com.lg.test.helloworld"); classe <?> c1 = loder2.FindClass ("com.lg.test.heloworld"); class <?> C2 = Loader.FindClass ("com.lg.test.demo01"); classe <?> c3 = loder.findClass ("com.lg.test.demo01"); classe <?> C3 = Loader.FindClass ("java.lang.string"); System.out.println (c.hashcode ()); System.out.println (c.getClassloader ()); System.out.println (c0.hashcode ()); System.out.Println (C0.getClassoder ()); System.out.Println (C0.getClOtor ()); System.out. .HashCode ()); System.out.println (c1.getClassOLODOFER ()); System.out.println (c2.hashCode ()); System.out.println (c2.getClassOader ()); System.out.println (C3.HashCode ()); System.out.println (C3.getClass (ClassNotFoundException e) {e.printStackTrace ();}}}Le résultat final est:
366712642
Sun.Misc.Launcher$AppCLASSOLODER@4E0E2F2A
366712642
Sun.Misc.Launcher$AppCLASSOLODER@4E0E2F2A
366712642
Sun.Misc.Launcher$AppCLASSOLODER@4E0E2F2A
1829164700
Sun.Misc.Launcher$AppCLASSOLODER@4E0E2F2A
2018699554
nul
Si vous définissez un chargeur de classe de réseau, vous devez utiliser une URL. C'est quelque chose à qui il faut prêter attention.
Vous pouvez modifier la valeur de rootdie en com.bjsxt.cn. Utilisez ensuite url.openStream ().
Ce qui précède concerne l'analyse des instances de chargeur de classe personnalisées en langue java. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!