Android 源码系列之<十九>自定义Gradle Plugin,优雅的解决第三方Jar包中的bug<下>

       转载请注明出处:http://blog.csdn.net/llew2011/article/details/78628613

       前边两篇文章Android 源码系列之<十七>自定义Gradle Plugin,优雅的解决第三方Jar包中的bug<上>Android 源码系列之<十八>自定义Gradle Plugin,优雅的解决第三方Jar包中的bug<中>里主要讲解了如何自定义Gradle Plugin,然后利用自定义的Gradle Plugin插件来修复项目中引用的第三方Jar包中的bug的方法,其核心就是利用开源库Javassist修复第三方Jar包中的class文件,然后在项目打包的时候把修复过的Jar包打包进项目中从而达到修复的目的。如果有小伙伴还没看过前两篇文章,强烈建议阅读一下。这篇文章我们就从源码的角度深入理解一下Javassist库是如何修复class文件的(*^__^*) ……

       阅读开源代码,一般都是从使用开始,记得在上篇文章中我们是如何使用Javassist库的么?首先是初始化了ClassPool对象sClassPool,代码如下:

public static void init(Project project, String versionName, BytecodeFixExtension extension) {
    sClassPool = ClassPool.default
    sInjector = new BytecodeFixInjector(project, versionName, extension)
}
       在BytecodeFixInjector的init()方法中通过ClassPool的静态方法getDefault()返回一个ClassPool对象然后赋值给了sClassPool,ClassPool是做什么工作的?它的职责是什么?根据名字像是一个对象池,既然是对象池,应该像数据库连接池一样能提供对象的哈,这是我第一次接触它的时候猜测的,我们看一下ClassPool的说明:

       A container of CtClass objects. A CtClass object must be obtained from this object. If get() is called on this object, it searches various sources represented by ClassPath to find a class file and then it creates a CtClass object representing that class file. The created object is returned to the caller.

       【译】ClassPool是CtClass的容器,每一个CtClass对象都必须从ClassPool中获取。如果调用了ClassPool的get()方法,那么ClassPool就会搜索由ClassPath指定的不同资源去找到一个class文件然后ClassPool就会创建一个CtClass对象,该对象就代表着那个.class文件。最后ClassPool创建的CtClass对象会返回给调用者。

       ClassPool objects hold all the CtClasses that have been created so that the consistency among modified classes can be guaranteed. Thus if a large number of CtClasses are processed, the ClassPool will consume a huge amount of memory. To avoid this, a ClassPool object should be recreated, for example, every hundred classes processed. Note that getDefault() is a singleton factory. Otherwise, detach() in CtClass should be used to avoid huge memory consumption.

       【译】ClassPool持有所有创建的CtClass对象,因此修改类的话,它们之间的一致性可以得到保证。因此,如果处理大量的CtClass类,ClassPool将要消耗大量的内存,为了避免这种情况,应该重新创建ClassPool对象,例如,每次都要处理成千上百的class类。注意,getDefault()方法是一个单例模式的工厂方法,因此,应该调用detach()方法来避免大量的内存消耗。

       ClassPools can make a parent-child hierarchy as java.lang.ClassLoaders. If a ClassPool has a parent pool, get() first asks the parent pool to find a class fil

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值