Я столкнулся с этой проблемой во время моей докторской исследования. Лучшим ответом для меня было выполнение модификации байт-кода в отдельной JVM с использованием библиотеки Java (я использовал ASM).
Я использовал перехват загрузки класса JVMTI, чтобы захватить файл класса и передать его в отдельную JVM, используя соединение tcp. Как только класс был изменен в отдельной JVM, я вернул его агенту JVMTI, который копирует его в память виртуальной машины и возвращает указатель на файл измененного класса в JVM.
Я обнаружил, что переплетать классы внутри той же JVM, что и при профилировании, было слишком сложно, так как файлы системных классов, которые я хотел изменить (например, java.lang.Object), должны были быть загружены до того, как все файлы классов мне понадобились выполнить ткачество. Я без особого успеха охотился за библиотеками байт-кода c / c ++, прежде чем остановиться на отдельном подходе JVM, который я наконец-то использовал.
Вы можете параметризовать агента JVMTI с помощью имени хоста / порта JVM ткача или использовать какую-либо форму обнаружения, в зависимости от ваших требований.