我在一些遗留代码中有一个静态方法,由多个客户端调用。我显然没有选择覆盖它,或通过依赖注入改变行为。我不被允许修改现有的课程。
我现在要做的是使用反射更改行为(该方法 - 使用相同的签名和返回类型)。
有可能吗?如果没有,任何设计模式都可以拯救我吗?
谢谢!
编辑:对于我可以更改/修改的内容存在一些疑惑。我无法更改任何现有的类/方法 - 但我可以为项目添加更多类。我能用现有类做的最好的就是注释它们。这样做是为了避免破坏现有代码中的任何内容 - 这意味着对一个大项目进行了一轮完整的测试。编辑2:java.lang.Instrumentation不适用于Android - 或者它听起来很合适!
答案 0 :(得分:26)
听起来像一个奇怪的要求......
无论如何,反射不允许你改变代码行为,它只能探索当前代码,调用方法和构造函数,改变字段值,那种东西。
如果要实际更改方法的行为,则必须使用字节码操作库(如ASM)。但这不是一件容易的事,可能不是一个好主意......
可能对您有帮助的模式:
无论如何,最合乎逻辑的做法是找到修改现有类的方法,解决方法只会使代码更复杂,更难维护。
祝你好运。答案 1 :(得分:12)
我想你可以查看Instrumentation类,它有一个方法redefineClasses(ClassDefintion classDefinition)
。
重新定义可能会更改方法体,常量池和属性。重新定义不得添加,删除或重命名字段或方法,更改方法的签名或更改继承。
希望这有帮助。
参考文献:Javadoc