Разрешит ли JDK 7 программу изменить свой собственный код?

StackOverflow https://stackoverflow.com/questions/5310450

  •  24-10-2019
  •  | 
  •  

Вопрос

Я заметил API компилятора в JDK 7. Означает ли это, что программа Java может перекомпилировать и изменить определение программы бега?

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

Это было полезно?

Решение

Компилятор API уже доступен в Java 6.

Мы не можем изменить код уже загруженных классов - замена горячего кода по -прежнему будет ограничена отладкой, но мы можем скомпилировать исходный код из приложений Java и загружать вновь созданные классы во время выполнения.

Другие советы

Да, это возможно. Одним из способов является написание специализированного класса-загрузчика и использовать инструмент улучшения байт-кодов, такой как ASM, и изменить части вашего приложения во время выполнения. Также возможно достичь того же, используя javaagent и опять ASM или что -то подобное.

Насколько я знаю, Java 7 не вводит никаких дополнительных методов самомодификации.

Некоторые из последствий уже можно сделать с помощью API компилятора и ClassLoaders, в то время как некоторые другие можно сделать, используя Jvm ti.

Но, насколько я знаю, Java 7 не вносит каких -либо серьезных изменений в этих API.

Существует проект по добавлению функциональности перезагрузки класса, похожей на Jrebel, в OpenJDK 7, хотя в настоящее время он не является частью Open JDK 7: Динамический код Evolution VM (DCEVM)

Он работает через нормальный Jvmti Механизм переопределения класса.

Копья предлагает функциональность по этим направлениям; Он доступен бесплатно, но не свободно перераспределяется.

Компилятор API (JSR 199) имеет мало общего с перезагрузкой кода или самомодификацией, за исключением того, что в качестве программы, которая желает в некотором роде загрузить новый байт-код, может использовать 199 для создания этого байт-кода из источника Java, а не использования API ассемблера. Как Асм.

Обновлять:

Похоже, что Javelon больше не доступен, так как он был приобретен Zeroturnaround (создатели Jrebel)

С домашней страницы копья:

Примечание: Javeleon больше не будет доступен для загрузки в качестве автономного продукта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top