31

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

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

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

谢谢 !

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

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

4

2 回答 2

35

听起来很奇怪的要求...

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

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

可能对您有帮助的模式:

  • 如果该类不是最终类并且您可以修改客户端,扩展现有类并使用您想要的行为重载该方法。编辑:只有在方法不是静态的情况下才有效!
  • 方面编程:使用 AspectJ 向方法添加拦截器

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

祝你好运。

于 2013-04-12T08:50:08.663 回答
25

我想你可以看看有一个方法的InstrumentationredefineClasses(ClassDefintion classDefinition)

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

希望这可以帮助。

参考资料:Javadoc

于 2013-04-12T08:54:49.220 回答