为什么PathClassLoader的父加载器(parent)是BootClassLoader?

写在前面

双亲委托机制中,当加载一个Class的时候,如果当前ClassLoader有父加载器的时候用父加载器加载。为什么PathClassLoader的父加载器(parent)是BootClassLoader?

查看PathClassLoader的源码

在这里插入图片描述
从上图可知,PathClassLoader构造函数传入了一个ClassLoader类型的参数parent。

PathClassLoader是何时创建以及parent是什么
从哪看呢?由于ActivityThread是我们常说的UI线程,ActivityThread类中的main()方法是整个应用的入口。所以我们来看一下ActivityThread的main()。

ActivityThread类的main方法

在这里插入图片描述
main方法中进行了MainLooper的初始化和主线程的创建以及主线程Handler的初始化
这里我们关注一下attach方法
在这里插入图片描述
在ActivityThread的attach方法中,ActivityManagerService通过attachApplication方法,将ApplicationThread对象绑定到ActivityManagerService上,mAppThread对象所对应的类是ApplicatinThread,是ActivityThread的内部类,实现了IBinder接口,用于ActivityThread和ActivityManagerService的进程间通信

我们接着看attachApplication方法
在这里插入图片描述
方法中调用了attachApplicationLocked方法
在这里插入图片描述
attachApplicationLocked方法中调用了mAppThread的bindApplication方法
在这里插入图片描述
bindApplication方法中创建了AppBindData对象,对象中设置了线程信息、application信息等
然后调用了sendMessage发消息,what = BIND_APPLICATION
在这里插入图片描述
sendMessage中封装了一下给主线程handler:mH 发消息
在这里插入图片描述
主线程handler的handleMessage方法中调用handleBindApplication方法
在这里插入图片描述
在这里插入图片描述
handleBindApplication方法中代码比较多,先关注两点:
1.创建了ContextImpl
2.调用了ContextImpl的getClassLoader()方法
看一下如何getClassLoader的
在这里插入图片描述
mClassLoader和mPackageInfo是构造函数中传入的,mClassLoader传入的是null,mPackageInfo传入的是data.info所以调用mPackageInfo.getClassLoader()
在这里插入图片描述

总结

我们写的应用程序的Class使用PathClassLoader加载,PathClassLoader的父加载器(parent)是BootClassLoader

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值