В настоящее время мы используем premain для преобразования всех классов до их загрузки. Но мы хотим сделать преобразование под контролем, что означает, что мы можем удалить/повторно добавить код, который мы вставляем в методы.Можем ли мы повторно преобразовывать классы после их загрузки?
Итак, мы нашли ретрансформу, но я не совсем понимаю ее.
- Можно ли загружать классы классов?
- Если это можно сделать, будут ли экземпляры повторно преобразованных классов запускать повторно преобразованный код?
- Если это невозможно, существует ли какая-либо технология для изменения кода определенного метода во время выполнения.
ОБНОВЛЕНО
Например, мы имеем класс А. Класс A имеет два метода Foo() и бар():
void foo() {
while(true) {
bar();
}
}
void bar() {
System.out.println("a");
}
мы называем Instrument.retransformClasses (Класс). и изменить бар() для:
void bar() {
System.out.println("b");
}
Если есть поток уже вызова Foo(), мы можем иметь выход:
...
a
a
a
b
b
b
...
если нет, то есть ли способ осуществить это?
Что вы подразумеваете под "transform"? – byxor
Возможный дубликат [Обновить код Java во время выполнения] (http://stackoverflow.com/questions/3079280/update-java-code-during-runtime) – Blobonat
В настоящее время мы реализуем ClassFileTransformer для вставки некоторого кода для каждого метода классов, который есть специальная аннотация на нем. Как я понимаю, преобразование изменяет байт-коды класса (по крайней мере, он выглядит как изменение байт-кодов, согласно javadoc классаFileTransformer # transform()). –