我需要在Android UI框架中的各种视图类上代理方法,如TextView
。特别是TextView#setText(int resId)
。此方法不是接口的一部分。因此,Java Proxy将不起作用,因为它只适用于接口。我需要使用字节码操作。非最终类中的代理最终方法
我发现了一个名为dexmaker的库,看起来很有希望。我假设我需要执行运行时字节码操作,因为Android View类只能在设备上使用。 Dexmaker可以在具体类上代理公共方法。然后我注意到TextView#setText(int resId)
是莫名其妙的final。 TextView
类本身是非最终的。
我想我可以fork dexmaker来支持非final类中的final方法。这可能吗?如果不是,我不想开始这个项目。这对我的图书馆来说将是一个巨大的胜利,因为开发人员不需要为其视图提供子类,接口或手动静态方法调用。我的图书馆需要知道什么时候在特定的视图上设置文本。代理是完美的设计模式。
随机拍摄(因为没有提到):布局充电器允许[设置工厂类](http://developer.android.com/reference/android/view/LayoutInflater。 html#setFactory2(android.view.LayoutInflater.Factory2))这可能是你在之后。这用在[probe](https://github.com/lucasr/probe/)中,工厂使用dexmaker动态地创建代理来拦截调用。 –
我的图书馆的一部分实际上使用布局充气器工厂技术。您是说您可以在通过dexmaker创建的视图对象上设置代理? – jophde
非常感谢Stefan。探测器来源正是我需要的:)。如果我理解正确Probe创建全新的View类,所以dexmaker Proxybuild无法处理最终方法的限制不是问题?来自dexmaker ProxyBuilder文档:“此过程仅适用于具有公共和受保护级别可见性的类。” – jophde