我在 SO 上遇到了许多类似的问题,但仍在试图弄清楚我们是否可以在运行时替换方法体,以及是否可以通过对该方法的现有调用来执行修改后的方法。
在阅读了许多类似问题的答案后,我了解到我们可以在运行时替换任何用户定义的类。然后我们可以加载修改后的类(例如,修改后的类中有修改的方法),创建该类的实例,并调用修改后的方法。这个问题的公认答案对我理解这个概念非常有帮助。
基本上,该答案中使用的示例解释说,如果我们更改Test1.hello()
,那将由类中的main
方法选择,Test
因为它正在创建Test1
类的新实例并通过该实例调用 hello。
Class cls = new TestClassLoader().loadClass("test.Test1");
Object obj = cls.newInstance();
cls.getMethod("hello").invoke(obj);
但是可能存在一些情况,hello()
代码库中存在许多现有调用(例如 in Test2.java
),我们希望在Test1
动态加载类之后,所有现有调用都Test2
将执行修改后的方法,而不是旧的.
我想知道这是否可能,或者我是否遗漏了什么。
提前非常感谢。