首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“‘Swizzle”(也许是通过反思?)安卓系统上的addView()

“‘Swizzle”(也许是通过反思?)安卓系统上的addView()
EN

Stack Overflow用户
提问于 2015-07-18 02:51:41
回答 1查看 2.1K关注 0票数 4

我知道你不能在Java中使用Swizzle。

我做了一些研究,我想“也许”你可以用Java语言做反射来实现类似Swizzle的行为(你可以在iOS上做)。

罪魁祸首(也是我见过的最糟糕的设计决策之一)是所有Android ViewGroup对象上的addView()函数。您必须显式检查父对象是否为空(有时甚至需要强制转换父对象才能获得所需的行为!)。真恶心。

我希望通过让addView()方法自动执行此检查来更改此方法的行为(而不创建一百万个子类),以便客户端代码可以忽略此检查。

这是我可以用反射来做的事情(据我所知,它需要特殊的运行时调用,而不是实际改变根方法调用,所以可能不够好),还是其他什么?还是我找错人了?

EN

回答 1

Stack Overflow用户

发布于 2015-07-18 03:14:31

正如您所提到的,如果不创建一百万个子类(或者更好地说,您希望覆盖addView实现的每个类对应一个子类),这似乎是不可能的。这实际上是正确的方法,而且这也意味着您可以在XML布局文件中使用这些子类。

反射将允许您在运行时检查类/接口/字段/方法,但它不允许您更改由已编译的底层实现提供的已定义行为。虽然有些更改是可能的,例如使私有方法/字段可访问。

灰色区域选项传入...

值得关注的一个方向是Mockito,它允许您在现有对象实例周围创建间谍,从而允许您覆盖默认实现。这是通过Java的proxiesInvocationHandlers实现的。然而,在这一点上,我会停下来告诉你,你的生产代码不应该包含任何测试代码,而Mockito显然就是为了这个目的。考虑到,至少在过去,在一些Android的类周围放置代理是困难的(如果不是不可能的话),我相信DexMaker已经解决了这个问题,我对自己知之甚少,但它确实允许你执行运行时代码生成。这将是另一个值得关注的方向。我个人认为,这些都不应该被认为是值得生产代码的可能的解决方案,而是为了你自己的好奇心和学习而尝试的东西。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31482756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档