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

Jag*_*uar 25 java android design-patterns legacy-code

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

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

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

谢谢 !

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

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

Pie*_*nry 27

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

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

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

可能对您有帮助的模式:

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

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

祝好运.


Dan*_*ush 16

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

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

希望这可以帮助.

参考文献:Javadoc

  • 抱歉,忘记添加这是Android。我没有这门课可用:( (2认同)