Эта статья в основном изучает соответствующее содержание динамической загрузки JAVA и файлов JAR и класса, следующим образом.
Загрузка файлов класса в Java динамична. Другими словами, мы будем загружаться только тогда, когда используем его, и если мы не будем его использовать, мы не будем загружать наш класс.
Java предоставляет нам два динамических механизма. Первый - неявный механизм. Второй - механизм отображения. следующее:
Два метода:
Метод class.forname () имеет две формы:
public static Class forName(String className)public static Class forName(String className, boolean initialize,ClassLoader loader) Вызов метода ForName () только с одним параметром эквивалентно class.forname (ClassName, True, Loader).
Оба метода должны быть подключены к нативному методу ForName0 () в конце.
ForName () с тремя параметрами, последний вызов: forName0 (имя, инициализирование, загрузчик);
Независимо от того, используете ли вы новый для создания определенного класса или используете метод class.forname () только с одним параметром, подразумеваются шаги «Загрузки класса + запуск статических кодовых блоков».
При использовании метода class.forname () с тремя параметрами, если второй параметр является false, загрузчик класса будет загружать только класс и не будет инициализировать статический блок кода. Только когда класс будет создан, будет инициализирован статический кодовый блок. Статический кодовый блок инициализируется, когда класс создается впервые.
ClassLoader используется для загрузки класса. Когда класс загружен, все классы, на которые ссылается этот класс, также будут загружены, и эта загрузка является рекурсивной. То есть, если ссылается на B и B относится к C, то когда A загружается, B также будет загружен, а когда B загружен B, C также будет загружен. Рекурсивный, пока все не требуется хорошо нагрузки класса.
пакет com.demo.test; импорт java.io.bytearrayoutputstream; import java.io.file; import java.io.fileinputstream; импорт java.io.filenotfoundexcept java.lang.reflect.method; import java.net.malformedurlexception; import java.net.url; import java.net.urlclassloader; открытый класс DynamicLoadDemo {enum fileType {jar, класс, другой} статический класс MyClassloader Extends extlader {public snchronize class <> stricklass piele -name -name -class -classclass (? Filenotfoundexception {class <?> Cls = findloadedclass (name); if (cls! = Null) {return cls;} fileInputStream fis = new FileInputStream (file); BytearRayoutputStream Baos = new BytearRayoutput -stream () trane in (int inten {inte in (int in ren ren; fis.read (buffer); if (len == -1) {break;} baos.write (buffer, 0, len);} // Процладка FileInputStream -пустая операция, потому что промывка -это функция записи вещей в кеше на объект (жесткий диск или сетевой поток). Здесь нет необходимости, так что это пусто. //baos.flush (); byte [] data = baos.tobytearray (); return decileclass (null, data, 0, data.length);} catch (ioexception e) {e.printstacktrace ();} наконец {try {baos.close ();} catchexcret e) {e. {fis.close ();} catch (ioexception e) {e.printstacktrace ();}} return null;}} public static void main (string [] args) {string classname = "com.demo.test.helloworld"; String Paths [] = {"helloworld.jar", "helloworld"; {String lowerPath = path.ToloWercase (); fileType fileType = fileType.other; if (lowerpath.endswith (". Jar") || lowerpath.endswith (". Zip")) {filetype = filetype.jar;} else if (lowerpath.endswith ("...) (fileType == fileType.other) {return;} file file = new File (path); if (! file.exists ()) {return;} try {url url = file.touri (). Tourl (); System.out.println (url.toString ()); class <?> cls = null; filletype) {urlloarder: ursloarder: ursloader: ursloader: ruletype) {urlloader: ruletype) New UrlClassLoader (новый URL [] {url}, think.currentThread (). getContextClassLoader ()); CLS = ClassLoader.LoadClass (className); Break; Case Class: MyClassLoader MyClassLoader = new MyClassLoader (); cls = myClassLoader.loadclass (classname, file); if offect; if offe felef wefalet; null) {return;} // varible vance varible field = cls.getdeclaredfield ("hello"); if (! field.isaccessible ()) {field.setAccessible (true);} System.out.println (field.get (cls.newinstance ()); // Вызовать метод Static без параметрических cls.getDeclaredMethod ("Saystatichello", Null); if (! staticmethod.isaccessible ()) {staticmethod.setaccessible (true);} // Если возвращаемое значение функции является void, nullstaticmethod.invoke (cls, null); // метод экземпляра с методом параметров = cls.getdeclaredmethod ("say", string.class); {method.setAccessible (true);} Object ret = method.invoke (cls.newinstance (), "hello world"); system.out.println (ret);} catch (malformedurlexception e) {e.printstacktrace ();} catch (classnotfoundexexcect {e.printstacktrace ();} catch (securityException e) {e.printstacktrace ();} catch (allogalaccessexception e) {e.printstacktrace ();} catch (allodalargumentexcept e) {e.printstacktrace ();} catch (nosuchfieldexception e) {e.printstacktrace ();} catch (filenotfoundexception e) {e.printstacktrace ();}}}}}результат:
Выше приведено все содержание этой статьи об анализе динамической загрузки Java Dynamic Jar и экземпляров файлов класса. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!