Java源文件经过编译成为了.class二进制字节码文件,那么下面我们需要去解释这个文件,也就是装载它。
类型的生命周期:
一个类型(类或接口)的生命周期,从开始阶段,装载,连接和初始化,以及占Java类型生命周期绝大部分时间的对象实例化,垃圾回收和对象终结,然后是Java类型生命周期的结束,也就是从虚拟机中卸载。这就是一个类型的完整生命周期。
那么装载(加载)是什么呢?
装载就是把二进制形式的Java类型读入到Java虚拟机中。
类型是如何被装载,装载到虚拟机之后又变成了怎么样的形式呢?
我们慢慢来解释。
类装载器的分类:
1.“启动”(bootstrap)类装载器:虚拟机实现的一部分,通常使用默认形式从本地磁盘中装载类,包括java API类库。说明白点,这种类装载器就本身JVM所有的,跟我们用户没有多大的关系。
2.用户自定义装载器,使用自定义的方式装载类。
装载阶段由三个基本动作组成,要装载一个类型,java虚拟机必须:
1.通过该类型的完全限定名,产生一个代表该类型的二进制数据流;
2.解析这个二进制数据流为方法区的内部数据结构(解析到了方法去哦~~)
3.创建一个表示该类型的 java.lang.Class 类的实例(反射,反射)
装载步骤的最终产品就是这个Class类的实例对象,它成为Java程序与内部数据结构之间的接口,要访问该类型的信息(它们就是存储在内部数据结构中的),程序就需要调用该类型对应的Class实例对象的方法。这样的一个过程,就是把一个类型的二进制数据解析为方法区中的内部数据结构,并且在堆上建立一个Class对象的过程,这被称为“创建”类型。
类装载器的层级结构:
关于类装载过程的:双亲委派模式
在Java1.2中引入了类装载器的形式化双亲委派模型,它的作用就是防止内存中出现多份同样的字节码
当JVM加载一个类时,下层的类装载器会将任务委托给上一层的类装载器,上一层的类装载器检查它的命名空间是否已加载,若已加载,直接返回并使用;若没有加载,继续往上委托至顶部,检查完了之后,按照相反的顺序加载。如果bootstrap类装载器找不到这个类,往下委托,直到找到他并加载他。
这就是双亲委派模式,突然觉得有木有觉得像Android中的 View的拦截原理,哈哈?
View的拦截原理也是:从父View到子View,判断 onInterceptTouchEvent 方法返回是否为true,若为true,则表示拦截成功,马上将这个动作交给 onTouchEvent方法处理,如果onTouchEvent方法返回true,则表示这个动作已经被这个View给消费。如果返回false,则交给这个View的父View去消费,调用父View的onTouchEvent方法。如果onInterceptTouchEvent方法返回的是false,那么就交给这个View的子View去拦截。哈哈有没有发现惊人的相似呢?不过MotionEvent事件的消费是先自顶向下来拦截,然后是自底向上进行消费这个动作。后面再详细地讲讲吧。
类加载机制,就先说到这里啦~~~有什么,错误的,不得当的地方还请指出谢谢。