Позволит ли JDK 7 программе изменять свой собственный код? - PullRequest
1 голос
/ 15 марта 2011

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

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

Ответы [ 5 ]

8 голосов
/ 15 марта 2011

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

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

3 голосов
/ 19 марта 2011

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

Работает через обычный JVMTI механизм переопределения классов.

3 голосов
/ 15 марта 2011

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

Некоторые из эффектов уже могут быть выполнены с помощью API компилятора и ClassLoaders, в то время как другие могут быть выполнены с помощью JVM TI .

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

3 голосов
/ 15 марта 2011

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

2 голосов
/ 09 декабря 2011

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

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

Обновление:

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

С домашней страницы Javelon:

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

...