Выполнение банки памяти

Предположим, у меня есть процесс Java, который получает исполняемый jar-файл от доверенного процесса в виде байта [], есть ли способ вызвать его без необходимости записи jar-файла на диск, а затем вызвать его (запустить новый процесс, который запускает банку)?


person shawn    schedule 04.09.2012    source источник
comment
Любое выполнение начинается с загрузчиков классов, которые загружают файлы классов из URL и далее обрабатывают их. Во-первых, то, что вы хотите выполнить, кажется невозможным, но не уверен, что какой-либо взлом загрузчика классов поможет.   -  person Santosh    schedule 04.09.2012


Ответы (2)


Вот один из способов, которым вы можете это сделать:

  1. Создайте ByteArrayInputStream из полученных byte [].
  2. Теперь используйте JarInputStream для создания в памяти представления файл jar.

    ByteArrayInputStream bis = new ByteArrayInputStream(byteArray); JarInputStream jis = new JarInputStream(bis);

  3. Таким образом, вы загрузите банку в память.

  4. Теперь вы можете использовать пользовательские загрузчики классов для дальнейшей обработки. Вот один пример, к которому вы можете обратиться.
person Santosh    schedule 04.09.2012

Самый простой подход — записать его на виртуальный диск и полностью отказаться от идеи в памяти.

person Adam    schedule 04.09.2012
comment
+1 Для этого вы можете использовать пользовательские загрузчики классов, но это в 100 раз сложнее, чем запись в файл. - person Peter Lawrey; 04.09.2012
comment
Вы не можете сделать это в Java, если у вас нет полного набора разрешений безопасности для таких вещей, как редактирование точек монтирования системы. В Linux вы могли бы сделать это, выполнив внешний сценарий, но в идеале вы должны настроить его с помощью сценариев загрузки вашего сервера. Я использовал эту ссылку kevingunn.org/?p=210, чтобы сделать это в Ubuntu. - person Adam; 04.09.2012