java – 非最终类中的代理最终方法

我需要在Android UI Framework中的各种视图类上代理方法,例如TextView.特别是TextView #setText(int resId).此方法不是界面的一部分.因此,Java Proxy将无法工作,因为它仅适用于接口.我需要使用字节码操作.

我发现了一个名为dexmaker的图书馆似乎很有希望.我假设我需要进行运行时字节代码操作,因为Android View类实际上只能在设备上使用. Dexmaker可以在具体类上代理公共方法.然后我注意到TextView#setText(int resId)莫名其妙地是final. TextView类本身是非final的.

我想我可以派dexmaker来支持非final类的最终方法.这可能吗?如果不是,我不想启动这个项目.这对我的库来说是一个巨大的胜利,因为开发人员不需要为他们的视图提供子类,接口或手动静态方法调用.我的图书馆需要知道何时在特定视图上设置文本.代理是完美的设计模式.

最佳答案
据我所知,这在Android上是不可能的.

Dexmaker创建包含新类的dex文件.然后使用dex类加载器将这些类添加到应用程序中.但是,此类dex文件不能用于替换类,只能添加用作代理的新子类.

从这个意义上说,dexmaker比javassist更像cglib.

请注意,Android既不提供与常规Jvm类似的检测功能,您可以通过代理通过类重新定义来检测最终类和方法. Android:http://developer.android.com/reference/android/app/Instrumentation.html不提供此功能

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...