java - 'Swizzle'(也许通过反射?) addView() 在 Android 上

标签 java android reflection swizzling

我知道您实际上不能用 Java 进行 Swizzle。

我正在做一些研究,我认为“也许”你可以在 Java 中进行反射来完成类似 Swizzle 的行为(你可以在 iOS 上进行)。

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

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

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

最佳答案

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

反射将允许您在运行时检查类/接口(interface)/字段/方法,但它不允许您更改已编译的底层实现提供的已经定义的行为。尽管可以进行一些更改,例如使私有(private)方法/字段可访问。

灰色区域选项传入...

一个值得研究的方向是 Mockito ,它允许您围绕现有对象实例创建 spy ,从而允许您覆盖默认实现。这是通过 Java 的 proxies 实现的。和 InvocationHandlers .然而,在这一点上我会停下来说你的生产代码不应该包含任何测试代码,而 Mockito 显然是为了这个。更重要的是考虑到,至少在过去,过去很难(如果不是不可能的话)在某些 Android 类(例如 ViewContext)周围放置代理.我相信这已由 DexMaker 解决,我对自己的了解较少,但它确实允许您执行运行时代码生成。这将是另一个值得关注的方向。我个人认为,这些都不应该被视为值得生产代码的可能解决方案,而是可以满足您自己的好奇心并从中学习的东西。

关于java - 'Swizzle'(也许通过反射?) addView() 在 Android 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31482756/

相关文章:

android - 为什么 Firestore Recycler Options 显示错误?

android - 检测耳机是否带麦克风

java - 使一个变量的实例类型与另一个变量的实例类型相同,针对接口(interface)进行编程

c# - 检查 System.Type 是否是给定类的后代的最佳方法

reflection - 如何从 refect.Value 获取结构字段

java - Jenkins 在多个操作系统上进行集成测试

java - 类型参数范围 - 未检查覆盖 : return type requires unchecked conversion

java - 从 Java 将 REFCURSOR 类型变量发送到 Oracle 存储过程

java - IntelliJ : Error:java: error: release version 5 not supported

android - 电话间隙 : how to check if gps is enabled