Este artigo estuda principalmente o conteúdo relacionado para a análise de instâncias de carregadores de classe personalizada no idioma Java, como segue.
O carregador de classe que escrevi
Deve -se notar que, se você deseja testar esta instância, primeiro crie um diretório C: // Myjava na unidade C. Em seguida, coloque o arquivo Java correspondente neste diretório. E coloque o arquivo .clas gerado no diretório c: //myjava/com/lg.test, caso contrário, ele não será encontrado. Isso é algo a ser dado atenção. .
Classe FileClassLoader:
pacote com.lg.test; importar java.io.bytearrayoutputStream; importar java.io.fileInputStream; importar java.io.ioexception; importar java.io.inputStream;/*** criado por 2016/8/8. */public class FileClassLoader estende a classe {String rootdir = null; public FileClassLoader (String rootdir) {this.rootdir = rootdir;}@substitua classe protegida <?> findClass (string className) lança classeNOTFoundException {// Primeira verificação se foi carregada. Classe <?> C = findLoadDclass (className); String Path = rootdir + "/" + className.replace ('. {return c;} else {/*se não funcionar, carregue novamente. Porque a essência do bytecode é uma matriz de bytes*/inputStream é = null; bytearrayOutputStream OutputStream = new ByteArrayOutputStream (); try {is = new FileInputStream (Path); Byte [] buffer = newte [1024]; int len = 0; 0, len);} c = DefinClass (className, buffer, 0, buffer.length);} c = DefinClass (className, buffer, 0, buffer.length);} c (Exceção e) {E.PrintStackTrace ();} finalmente {if (is! {E.PrintStackTrace ();}}}} retornar C;}}}}}Demonstração de classe:
pacote com.lg.test;/*** Criado em 2016/8/6. *//*O mesmo carregador de classe carrega a mesma classe, e o código HasC é o mesmo. Diferentes carregadores de classe carregam a mesma classe, e o código HasC é diferente. */public classe Demo {public static void main (string [] args) {FileClassLoader carregador = new FileClassLoader ("c: // myjava"); FileClassloader carregador2 = new FileClassloader ("C: // myjava"); tentativa {classe <?> C = C = carregador.findclass ("com.lg.test.helloworld"); classe <?> c0 = carregador.findclass ("com.lg.test.helloworld"); classe <?> c1 = carregador2.findclass ("com.lg.test.helloworld"); classe <?> c2 = carregador.findclass ("com.lg.test.demo01"); classe <?> c3 = carregador.findclass ("com.lg.test.demo01"); classe <?> C3 = carregador.findclass ("java.lang.string"); System.out.println (c.hashcode ()); system.out.println (c.getclassloader ()); system.out.println (c0.hashcode ()); system.out.println (c0.ng.ngLl .hashcode ()); system.out.println (c1.getclassloader ()); system.out.println (c2.hashcode ()); system.out.println (c2.getClassLoader ()); system.out.println (c3.HashCode ()); (ClassNotFoundException e) {E.PrintStackTrace ();}}}O resultado final é:
366712642
sun.misc.launcher$AppClassloadner@4E0E2F2A
366712642
sun.misc.launcher$AppClassloadner@4E0E2F2A
366712642
sun.misc.launcher$AppClassloadner@4E0E2F2A
1829164700
sun.misc.launcher$AppClassloadner@4E0E2F2A
2018699554
nulo
Se você definir um carregador de classe de rede, precisará usar um URL. Isso é algo a ser dado atenção.
Você pode alterar o valor do rootdie para com.bjsxt.cn. Em seguida, use url.openstream ().
O exposto acima é sobre a análise de instâncias de carregador de classe personalizadas no idioma Java. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!