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

标签 java android design-patterns legacy-code

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

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

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

谢谢!

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

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

最佳答案

听起来是个奇怪的要求……

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

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

可能对您有所帮助的模式:

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

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

祝你好运。

关于java - 如何通过反射改变方法行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15966726/

相关文章:

java - 如何从 Netbeans Navigator 窗口中删除 getter 和 setter

android - 将 Zip 提取到 SD 卡非常慢。我如何优化性能?

android - 用安卓模拟器正常吗?

java - 这是工厂模式的正确用法吗?

java - 没有方法的接口(interface)与字段

java - 如何覆盖数组的 equals 方法?

java - 使用 Jena 将子子项添加到 RDF

java - 当行 id 相同时累加删除行项

android - 最新的 Youtube API 使应用程序在 Android 4.0.4 下崩溃

java - 如何在 Spring @Service 和非 Spring 对象之间集成?