如何通过反思改变方法行为?

2022-09-01 09:33:52

我在一些遗留代码中有一个静态方法,它由多个客户端调用。我显然没有选择覆盖它,或者通过依赖注入来改变行为。不允许我修改现有类。

我现在想做的是使用反射更改行为(该方法 - 具有相同的签名和返回类型)。

可能吗?如果没有,任何设计模式都能拯救我吗?

谢谢!

编辑:关于我可以更改/修改的内容存在一些混淆。我无法更改任何现有的类/方法 - 但我可以向项目添加更多类。我对现有类能做的最好的事情就是对它们进行注释。这一切都是为了避免破坏现有代码中的任何内容 - 这意味着对大项目进行一轮完整的测试。

编辑2:java.lang.Instrumentation不适用于Android - 否则它听起来很合适!


答案 1

听起来像是一个奇怪的要求...

无论如何,反射不允许你改变代码行为,它只能探索当前代码,调用方法和构造器,更改字段值,诸如此类的事情。

如果要实际更改方法的行为,则必须使用字节码操作库,如 ASM。但这不会很容易,可能不是一个好主意...

可能对您有帮助的模式:

  • 如果该类不是最终的,并且您可以修改客户端,请使用所需的行为扩展现有类并重载该方法。编辑 :只有当方法不是静态的时,这才有效!
  • 方面编程:使用AspectJ将拦截器添加到方法中

无论如何,最合乎逻辑的做法是找到一种方法来修改现有类,解决方法只会使您的代码更加复杂且难以维护。

祝你好运。


答案 2

我想你可以看看具有方法的仪器类。redefineClasses(ClassDefintion classDefinition)

重定义可能会更改方法主体、常量池和属性。重定义不得添加、移除或重命名字段或方法,也不得更改方法的签名,也不得更改继承。

希望这有帮助。

参考文献:Javadoc


推荐