Java: возможно ли выполнить измененный код метода (измененный во время выполнения), используя его существующие вызовы

У меня было много похожих вопросов по 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 выполняли измененный метод, не старый.

Мне было интересно, возможно ли это вообще, или я что-то упускаю.

Заранее большое спасибо.


person Ripon Saha    schedule 17.03.2016    source источник