Если вы хотите использовать пользовательский загрузчик класса для загрузки файла класса, вам нужно наследовать класс Java.lang.classloader.
Есть несколько важных методов для загрузчика:
ProtectedClassLoader (ClassLoaderParent): создает новый загрузчик класса с использованием указанного загрузчика родительского класса для операций делегирования.
ProtectectfinalClass <?> DecineClass (StringName, Byte [] B, Intoff, Intlen): преобразовать массив байтов в экземпляр класса.
ProtectedClass <?> FindClass (StringName): Найдите класс с указанным двоичным именем.
publicClass <?> LoadClass (StringName): загрузите класс с указанным двоичным именем.
ProtectectfinalClass <?> FindLoadedClass (StringName): если виртуальная машина Java записала этот загрузчик как загрузчик стартапа класса с данным двоичным именем, класс с этим двоичным именем возвращается. В противном случае вернуть ноль.
publicfinalclassloadergetParent (): возвращает делегированный погрузчик родительского класса.
ProtectedFinalVoidReSolVeclass (Class <?> C): ссылка на указанный класс.
Если вы хотите следовать родительской модели делегирования, тогда переписывайте метод FindClass (StringName); Если вы не хотите следовать родительской модели делегирования, то переписывайте метод LoadClass (StringName) напрямую.
Настроить загрузчики классов, которые следуют модели родительской делегирования
PartyDelegateClassloader.java
package com.zzj.classloader;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;/** * Parents delegate class loader and override findClass(name) method* * @author Administrator * */public class ParentsDelegateClassLoader Extends ClassLoader {Private Static Final String ext = ".class"; Purity String Path; public partyDelegateClassloader () {path = this.getResource (""). getPath ();} public partyDelegateClassloard (String Path) {this.path = pathrise@overcected class <? null; try {b = loadclassfile (name);} catch (ioexception e) {e.printstacktrace ();} вернуть это. + classfile); BytearRayOutputStream Out = new BytearRayoutputStream (); inputStream input = new FileInputStream (classFile); int count; byte [] temp = new Byte [1024]; while ((count = input.read (temp)))> -1) {out.write (temp, 0, count); out.tobytearray ();} частная строка getclassfile (string name) {string pathname = name.replace (".", file.separator); if (path.endswith ("/") || path.endswith ("//")) {return Path + ext;} return Path + file.separator + pathname + ext;} etmeme;}}}}}}}}}}}}}}}}Теперь есть файл класса com/zzj/classloader/user.class в ClassPath ClassPath и f: // classloadertest // каталог bin. Имя пакета com.zzj.classloader. Используйте класс Loader PartyDelegateClassloader, чтобы загрузить класс в соответствии с f: // classloadertest // bin.
пакет com.zzj.classloader; public class app {private static final String path = "f: // classloadertest // bin"; частная статическая конечная строка classname = "com.zzj.classloader.user"; public static void main (string [] args) бросает исключение {partyDelegateClassloader ClassLoader = new ParentLegAtcals (wationLazzAlcloader (wationLazzAzglAzzeclass); ClassLoader.loadClass (className); System.out.println (clazz); System.out.println (clazz.getClassloader ());}}Выход:
Класс com.zzj.classloader.user sun.misc.launcher$appclassloader@19821f
Загрузчиком пользовательского класса является загрузчиком загрузчика системы Class Class, а не загрузчика класса, который мы определяем себя. На самом деле, это не класс в рамках F: // classloadertest // bin, а класс под классом. Это родительская модель делегирования: когда загрузчик PartyDelegateClassloader получает запрос на загрузку, он сначала передаст загрузчику родительского класса. Если родительский загрузчик класса успешно загружается, будет возвращен объект класса. Если нагрузка не удается, загрузчик класса, который получил запрос на загрузку, будет загружен.
Удалить класс пользователя в ClassPath для тестирования запуска:
Файл класса будет загружен в ближайшее время f: /classloadertest/bin/com/zzj/classloader/user.class class com.zzj.classloader.user com.zzj.classloader.parentsdelegateclassloader@61de33
В настоящее время класс пользователя загружается как PartyDelegateClassloader.
Это можно проверить из исходного кода класса загрузчика:
public class <?> LoadClass (String name) Throws classNotFoundException {return LoadClass (имя, false); }Перегруженный метод был вызван:
Защищенный синхронизированный класс <?> LoadClass (имя строки, логическое разрешение) выбрасывает ClassNotFoundException {// сначала определить, был ли класс загружен текущим классом класса CRAODER C = FINDLARGEDCLASS (имя); if (c == null) {try {if (parent! = null) {// Если существует загрузчик родительского класса, то делегируйте в родительский класс для загрузки c = parent.loadclass (name, false); } else {// Если родительский класс загружается пустым, его родительский загрузчик класса является загрузчиком класса загрузки c = findbootStrapClass0 (name); }} catch (classnotfoundexception e) {// Если родительский загрузчик класса не загружается, он загрузится сам и вызовет метод findclass! c = findClass (имя); }} if (Resolve) {ResolVeclass (c); } return c; }Видно, что если вы хотите уничтожить модель родительской делегирования, вы можете напрямую переписать метод LoadClass (StringName).
Настройка загрузчиков классов, которые не следуют модели родительской делегации
Notparentsdelegateclassloader.java
пакет com.zzj.classloader; импорт java.io.bytearrayoutputstream; import java.io.file; import java.io.fileinputstream; импорт java.io.filenotfoundexcept @author Administrator * */public class notparentsdelegateclassloader extends classloader {private Static Final String ext = ".class"; private String Path; public notParentsDelegateClassloader () {path = this.getResource ("). getPath ();} public notparentsDelegAteclaslollockloskloskloskloskloasler (string pather) {this.patht.te. Class <?> LoadClass (String name) Throws classNotFoundException {byte [] b = null; try {b = LoadClassFile (name);} catch (filenotFoundException e) {System.err.println («Загрузка» + this.getClass (). GetName () + «Нет класса, найденный», «Имя», DELEGSTED TO THE PANITER TOM! родительский класс загрузчик return getClass (). getClassLoader (). getClass (). getClassLoader (). {System.out.println ("class" + name + "еще не загружен!");} Вернуть this.defineclass (name, b, 0, b.length);} private byte [] loadclassfile (name string) throws ioexception, filenotfoundexception {String classfile = GetClassFile (name); ClassFile); BytearRayOutputStream Out = new BytearRayOutputStream (); inputStream input = new FileInputStream (classFile); int count; byte [] temp = new Byte [1024]; while ((count = input.read (temp)))> -1) {out.write (temp, 0, count); out.tobytearray ();} частная строка getclassfile (string name) {string pathname = name.replace (".", file.separator); if (path.endswith ("/") || path.endswith ("//")) {return Path + ext;} return Path + file.separator + pathname + ext;} etmeme;}}}}}}}}}}}}}}}}Теперь есть файл класса com/zzj/classloader/user.class в ClassPath ClassPath, с именем пакета com.zzj.classloader, а класс пользователя является загрузчиком notparentsdelegateclassloader.
пакет com.zzj.classloader; public class app2 {private static final string classname = "com.zzj.classloader.user"; public static void main (string [] args) выбрасывает исключение {notparentsDelegateClassloader classloader = new NotParentsDelegateclass (); class <?> clazz = clazz = clazz = clazz = clazz = clazz = clazz = clazz. ClassLoader.loadClass (className); System.out.println (clazz); System.out.println (clazz.getClassloader ());}}Выход:
Файл класса/e:/myeclipse/zzjtest/webroot/web-inf/classes/com/zzj/classloader/user.class crass com.zzj.classloader.user еще не загружен! Файл класса будет загружен скоро/e: /myeclipse/zzjtest/webroot/web-inf/classes/java/lang/object.class com.zzj.classloader.user com.zzj.classloader.notparentsdelegateclassloader@61de33 com.zzzj.zclassloaderererdlogloglogloglegloader @61de33 com.zzzj.classlader java.lang.object не найден и будет делегирован в родительский загрузчик класса!
В настоящее время погрузчиком пользовательского класса является NotPparentsDelegateClassloader, который сначала не делегирован родительскому классу. Он будет делегирован в родительский загрузчик класса только в случае неудачи нагрузки. Это является противоположностью модели родительской делегирования.
Конечно, даже если нагрузка не удается, ее можно указать без делегирования в родительский загрузчик класса, чтобы можно было построить механизм загрузки класса более сложных сетчатых моделей.
Суммировать
Приведенное выше пример кода примера загрузчика класса Java Class, я надеюсь, что он будет полезен для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!