我知道你实际上不能用Java进行Swizzle。
我正在做一些研究,我想也许'你可以用Java做反射来完成类似Swizzle的行为(你可以在iOS上做)。
罪魁祸首(以及我见过的最糟糕的设计决策之一)是所有Android ViewGroup对象上的addView()
函数。您必须显式检查父项是否为空(有时甚至需要强制转换父项以获取所需的行为!)。毛。
我希望通过让addView()
方法自动执行此检查来更改此行为(不创建一百万个子类),以便客户端代码可以忽略它。
这是我可以用Reflection做的事情(从我掌握它需要特殊的运行时调用,而不是实际更改根方法调用[所以可能不够好]),或其他什么?还是我在错误的树上吠叫?
答案 0 :(得分:3)
正如您所提到的,如果不创建一百万个子类(或者更好的put,每个类的一个子类,您希望覆盖addView
实现),这似乎是不可能的。这实际上是正确的方法,也意味着您可以在XML布局文件中使用这些子类。
Reflection允许您在运行时检查类/接口/字段/方法,但它不允许您更改已编译的底层实现提供的已定义行为。虽然可以进行一些更改,例如可以访问私有方法/字段。
灰色区域选项传入...
值得研究的一个方向是Mockito
,它允许您在现有对象实例周围创建间谍,以允许您覆盖默认实现。这是通过Java proxies和InvocationHandler
s实现的。但是,此时我会停下来说你的生产代码不应该包含任何测试代码,而Mockito显然是有意义的。更重要的是,考虑到这一点,至少在过去,过去很难(如果不是不可能)将代理放在Android的某些类中,例如View
和Context
。我相信这已由DexMaker解决,我对自己的了解较少,但它确实允许您执行运行时代码生成。这将是另一个值得关注的方向。我个人认为这些都不应被视为可能的生产代码解决方案,而是要为自己的好奇心和学习而努力。