[Java] Dynamic Loading

Нет Gravatar

Программа очень часто считают необходимым включить дополнительные фрагменты кода в систему во время ее использования (в качестве примера возможности включения плагина в одном приложении, они должны быть использованы сразу же после их "установки"), мы видим каким образом и в каких пределах, это достижимо с языком ВС

Компиляция время выполнения программы:

Во-первых, это полезно знать, что из любого приложения Java может вызвать компилятор (Javac) с обычными параметрами (классы и все остальное) с помощью простой

  new String [ ] { Главная. Компиляции (новая строка [] (
 , "-D", "Бин /",
 filename + ".java" } ) ; "SRC / generatedCode /" + имя файла +. "Java")); 

NB: по различным параметрам (я ушел из многих, в том числе варианты компиляции) я оставляю документацию по API.

Загрузка:

Потому что у вас есть файл. Из класса в нашем приложении нагрузки у нас есть 2 дороги, исходя из того, что мы знаем имя этого класса:

  1. Если у нас нет конкретной информации о классе вывести через механизмы анализа и инстанцирования методы;
  2. Если у нас есть структурированное "плагина" осуществить известный интерфейс для создания экземпляра объекта (как мы увидим в ближайшее время) и вызывать методы интерфейса.

2 я буду рассматривать это дело, поскольку в противном случае слишком много отвлекаться от предмета, который является довольно сложным и интересным отражением.

Рассмотрим следующий случай:

Класс A (тот, который мы хотим загрузить) B реализует интерфейс.

  new ClassLoader ( ) ; ClassLoader Loader = новый ClassLoader ();
 gt ; cls = loader. loadClass ( "A" ) ; Класс & LT;? & GT; Cls = погрузчика. LoadClass ( "A");
 B ) cls. newInstance ( ) ; Istanza_di_A = B (B) CLS. NewInstance ();
 ... ) ; istanza_di_A. metodoDiA (...); 

Как Вы можете видеть процесс очень проста в реализации, давайте посмотрим, что теперь является основным ограничением.

UnloadingReloading:

К сожалению, JVM не позволяет выгрузку классы загружаются на байт.
Рассмотреть предложение о внесении поправок в Кодекс классе сразу после создания экземпляра объекта такого типа в нашей программе. Мы хотели бы, как это кажется вполне естественным, что после загруженного байт-класса изменили и перекомпилировали, новые объекты типа "А", созданной в соответствии с последней доступной версии.

К сожалению, этого не происходит, мы видим, почему.
Загрузчиком классов, которые ранее мы использовали "обвинение" в память о нашем классе байт-кода во время выполнения, как мы уже говорили, не может быть (вручную или автоматически) для обработки разгрузки классы экземпляра приложения. На момент создания объекта просто следуйте следующим алгоритмом (что сопряжено с весьма упрощенное письмо):

  1. Проверка структуры данных (хэш-таблицу), если есть запись в классе, что ему было предложено груза происходит с именем класса ( "class_name" -> "байт");
  2. Если вы не можете найти соответствующие записи в названии создает один, и после чтения файла. Классе, кроме байт-кода в такой структуре затем возвращает экземпляр программы.
  3. Или, если вы найдете запись для имени класса, это не касается никоим образом оценить, является ли байт обновляется или нет; экземпляр объекта из байт-код сохраняется и вернулся в программу.

Как вы можете себе представить то изменения вступят в силу только после перезагрузки программы.
Только существующие решения для реализации пользовательских ClassLoader этом случае мы имеем дело с caricareistanziare классы, которые мы хотим использовать как плагин, и что, если какой-либо происходят изменения, мы можем "вышвырнуть" (поставив все свои ссылки на NULL) reinstanziarene для нового приложения, которое заботится об управлении нового кода в своей частной структуры данных.

Громоздкие реальные решения? Ну, если он делает хорошо, чтобы обновить ОПРАВКИ Tomcat JSP, сказали бы уместным, чтобы настроить :)

Популярность: 19% [?]

Ключевые слова:


leave a response , or trackback from your own site. Вы можете последовать за всеми реакциями к этому входу через RSS 2.0 питание. Вы можете оставить ответ, или Архив с вашего собственного сайта.

AddThis Social Bookmark Button

Данный сайт использует IntenseDebate комментарии, но они в настоящее время не загружен, потому как Ваш браузер не поддерживает JavaScript, либо они не были загружены достаточно быстро.

Написать ответ