Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过反射改变方法行为?_Java_Android_Design Patterns_Legacy Code - Fatal编程技术网

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

Java 如何通过反射改变方法行为?,java,android,design-patterns,legacy-code,Java,Android,Design Patterns,Legacy Code,我在一些遗留代码中有一个静态方法,由多个客户端调用。我显然没有办法覆盖它,也没有办法通过依赖注入来改变行为。我不允许修改现有的类 我现在想做的是使用反射更改行为(该方法-具有相同的签名和返回类型) 可能吗?如果没有,任何设计模式能拯救我吗 谢谢 编辑:对于我可以更改/修改的内容存在一些混淆。我不能更改任何现有的类/方法,但我可以向项目中添加更多的类。我对现有类所能做的最好的事情就是对它们进行注释。所有这些都是为了避免破坏现有代码中的任何内容,这意味着对一个大型项目进行一轮完整的测试 编辑2:ja

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

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

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

谢谢

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


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

听起来是个奇怪的要求

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

如果您想要实际更改方法的行为,您必须使用字节码操纵库,如ASM。但这并不容易,可能不是个好主意

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

  • 如果类不是final,并且您可以修改客户机,则扩展现有类并使用所需的行为重载该方法。编辑:只有在方法不是静态的情况下才有效
  • 方面编程:使用AspectJ向方法添加拦截器
无论如何,最合乎逻辑的做法是找到一种修改现有类的方法,变通方法只会使代码更复杂,更难维护


祝你好运。

我想你可以看看这个类,它有一个方法
重定义类(classdefination classDefinition)

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

希望这有帮助


引用:

不允许您更改它,但允许您通过反射修改它?这似乎风险更大。我认为这将成为一场维护噩梦。密码会对任何阅读它的人撒谎。去申请更改该等级的批准。@SpaceTrucker:我明白这很棘手-我们有机制提醒未来的团队注意这一点。这就是我获得批准的原因。AOP,面向方面的编程可以做到这一点,包装它的调用。您在任何情况下都在改变行为,这需要测试。所以测试工作总是一样的。唯一的问题是如何实现该更改。静态方法不能被重写。我想知道反射是否能改变字段值,为什么不能改变方法呢!我是AOP的新手。现在就开始探索吧!当然,关于方法是静态的,你是对的。我相应地编辑了我的答案。对不起,忘了添加这是Android。我没有这门课:(