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

时间:2013-04-12 08:38:32

标签: java android design-patterns legacy-code

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

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

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

谢谢!

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

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

2 个答案:

答案 0 :(得分:26)

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

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

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

可能对您有帮助的模式:

  • 如果类不是最终类,您可以修改客户端,请扩展现有类并使用您期望的行为重载该方法。编辑:只有在方法不是静态时才会起作用!
  • Aspect编程:使用AspectJ
  • 为方法添加拦截器

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

祝你好运。

答案 1 :(得分:12)

我想你可以查看Instrumentation类,它有一个方法redefineClasses(ClassDefintion classDefinition)

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

希望这有帮助。

参考文献:Javadoc