如何通过reflection改变方法行为?

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

我现在要做的是使用reflection改变行为(该方法 – 具有相同的签名和返回types)。

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

谢谢 !

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

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

Related of "如何通过reflection改变方法行为?"

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

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

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

可能对您有帮助的模式:

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

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

祝你好运。

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

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

希望这可以帮助。

参考文献: Javadoc