У меня было много похожих вопросов по SO, но я все еще пытался выяснить, можем ли мы заменить тело метода во время выполнения и может ли этот измененный метод выполняться с помощью существующих вызовов этого метода.
Прочитав множество ответов на похожие вопросы, я узнал, что мы можем заменить любой определяемый пользователем класс во время выполнения. Затем мы можем загрузить измененный класс (например, в измененном классе есть измененный метод), создать экземпляр этого класса и вызвать измененный метод. Принятый ответ на этот вопрос очень помог мне понять концепцию.
В основном пример, использованный в этом ответе, объясняет, что если мы изменим Test1.hello()
, это будет выбрано методом main
в классе Test
, поскольку он создает новый экземпляр класса Test1
и вызывает приветствие через этот экземпляр.
Class cls = new TestClassLoader().loadClass("test.Test1");
Object obj = cls.newInstance();
cls.getMethod("hello").invoke(obj);
Но могут быть ситуации, когда есть много существующих вызовов hello()
в базе кода (например, в Test2.java
), и мы хотим, чтобы после динамической загрузки класса Test1
все существующие вызовы в Test2
выполняли измененный метод, не старый.
Мне было интересно, возможно ли это вообще, или я что-то упускаю.
Заранее большое спасибо.