Android学习笔记一:Java类加载过程

2019-02-27 16:11 阅读 76 次 评论 0 条
版权声明:本文著作权归TeachCourse所有,未经许可禁止转载,谢谢支持!
转载请注明出处:http://teachcourse.cn/2668.html
  • 简单描述Java类加载过程

根据类全名获取类的二进制字节流

将二进制字节流所代表的的静态存储结构转换成方法区中的数据结构

然后在堆中实例化代表这个类的java.lang.Class对象,作为对方法区数据的访问入口

【深入Java虚拟机】之三:类初始化
https://blog.csdn.net/ns_code/article/details/17845821)
【深入Java虚拟机】之四:类加载机制
http://blog.csdn.net/ns_code/article/details/17881581)

  • 简单描述对象创建过程
  1. JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区
  2. 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容
  3. 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内
  4. 加载静态内容:
    • 把.class中的所有静态内容加载到方法区下的静态区域内
    • 静态内容加载完成之后,对所有的静态变量进行默认初始化
    • 所有的静态变量默认初始化完成之后,再进行显式初始化
    • 当静态区域下的所有静态变量显式初始化完后,执行静态代码块
  5. 当静态区域下的静态代码块,执行完之后,整个类的加载就完成了。

Java中类加载过程和对象创建过程
http://blog.csdn.net/u014338577/article/details/49968253

  • Java 类的加载过程(阿里面试题)
  1. 加载方法不等于执行方法,初始化变量则会赋值
  2. 类加载顺序应为加载静态方法-初始化静态变量-执行静态代码块
  3. 实例化时先加载非静态方法-实例化非静态变量-执行构造代码块-执行构造函数

Java 类的加载过程(阿里面试题)
https://www.cnblogs.com/tengpan-cn/p/5869099.html

  • Java静态代码块、构造代码块、构造方法的执行顺序

执行静态代码块——>执行构造代码块——>执行构造方法

  • JVM(三):类加载机制(类加载过程和类加载器)

双亲委派模型的工作过程为:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的加载器都是如此,因此所有的类加载请求都会传给顶层的启动类加载器,只有当父加载器反馈自己无法完成该加载请求(该加载器的搜索范围中没有找到对应的类)时,子加载器才会尝试自己去加载

JVM(三):类加载机制(类加载过程和类加载器)
http://blog.csdn.net/boyupeng/article/details/47951037

  • 深入分析ClassLoader

类加载器结构图

BootstrapClassLoader ExtensionClassLoader ApplicationClassLoader CustomClassLoader
加载特定目录下的jar包文件:
jre\lib\*.jar
加载特定目录下的jar包文件:
jre\lib\ext\*.jar
加载classpath目录下的jar包文件或类文件,比如:
jdk\lib\*.jar
加载自定义目录相关类文件

深入分析ClassLoader
http://blog.csdn.net/tonytfjing/article/details/47212291

  • Custom ClassLoader、Application ClassLoader、Extension ClassLoader、Bootstrap ClassLoader会不会重复加载的同一个class文件

虽然有不同的ClassLoader,但通常同一份class文件只会被加载一次,这是因为由JVM的双亲委派机制决定的

双亲委派机制,指的是如果一个类加载器收到一个加载请求,如果存在父类加载器,它不会自己去处理,而是把请求反馈给父类加载器;同理,父类加载器也会检查自己是否存在另一个父类加载器,依次将加载请求往上传递;直到将请求传递给顶层加载器,只有当顶层父类加载器无法处理加载请求时,才把加载请求反馈给子加载器,这样的一种加载机制保证同一个class文件只被加载一次

  • 能不能自己写个类叫java.lang.System?

因为双亲委派机制的原因,父类加载器加载的类,子类加载器是没有机会加载的。java.lang.System是由Bootstrap ClassLoader加载的类,即使重写了,也不会被重新加载

JVM(三):类加载机制(类加载过程和类加载器)
http://blog.csdn.net/boyupeng/article/details/47951037
Android插件化探索(一)类加载器DexClassLoader
http://blog.csdn.net/maplejaw_/article/details/51493843

关注公众号 扫一扫二维码,加我QQ

如果文章对你有帮助,欢迎点击上方按钮关注作者

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ1589359239或公众号TeachCourse)
转载请注明出处:http://teachcourse.cn/2668.html
分类:Android, 面试题 标签:
集合BroadcastReceiver和Service制作的音乐播放器 集合BroadcastReceiver和Serv
浅谈Android SDK 浅谈Android SDK
浅谈SQLite数据库的操作 浅谈SQLite数据库的操作
Android常见布局 Android常见布局

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情