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

新手上路,请多包涵

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

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

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

谢谢 !

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

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

原文由 dev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 929
2 个回答

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

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

如果你想真正改变一个方法的行为,你将不得不使用一个字节码操作库,比如 ASM。但这不会很容易,可能不是一个好主意……

可能对您有帮助的模式:

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

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

祝你好运。

原文由 Pierre Henry 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

希望这可以帮助。

参考资料: Javadoc

原文由 Dangling Piyush 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题