1.ClassLoader(类加载器)
1> java虚拟机与程序的生命周期
在以下情况,程序将结束生命周期
(1)执行了System.exit()方法
(2)程序正常执行完
(3)程序在执行过程中发生异常或者错误而异常终止
(4)由于操作系统发生错误而导致java虚拟机进程终止
2>类的加载、连接、初始化
类的加载:查找并加载类的二进制数据(将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构)
连接:(将已经读入到内存中的类的二进制数据合并到虚拟机的运行时环境中)
-验证(类文件的结构检查,语义检查,字节码验证,二进制兼容性的验证):确保被加载类的正确性
-准备:为类的静态变量分配内存,并将其初始化为默认值
-解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予正确的初始值。
3>java程序对类的使用方式有两种:主动使用和被动使用(除去主动使用的都是被动使用)
所有的java虚拟机实现必须在每个类或接口被java程序“首次主动使用”时才初始化他们
主动使用(六种)
(1)创建类的实例
(2)访问某个类或接口的静态变量,或者对该静态变量赋值
(3)调用类的静态方法
(4)反射
(5)初始化一个类的子类
(6)java 虚拟机启动时被标明为启动类的类
4>加载.class文件的方式
从本地系统直接加载
通过网络下载.class文件
从zip,jar等归档文件中加载.class文件
从专有数据库中提取.class文件
将java源文件动态编译为.class文件
5>类加载器的类型
-java虚拟机自带的加载器
根加载器(Bootstrap 由c++写),扩展类加载器(Extension java编写),系统类加载器(System java编写)
-用户自定义的加载器(java.lang.ClassLoader的子类),用户可以定制类的加载方式
6>类加载器不需要等到某个类被“首次主动使用”时再加载他。
(1)JVM规范允许类加载器在预料某个类将要被使用的时候就预先加载它,如果在加载的过程中遇到了
.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报错(LinkageError错误)。
(2)如果这个类一直没有主动程序使用它,那么类加载器就不会报告错误。
7>定义类加载器
如果某个类加载器能够加载一个类,那么该类加载器就被称为定义类加载 器。
定义类加载器及其所有子加载器都被称为:初始类加载器
8>当生成一个自定义的类加载器的实例时,若果没有指定它的父加载器,那么系统类加载器将成为该类加载器的父加载器。
9>运行时包:由同一类加载器加载的属于相同包的类组成 运行时包。只有属于同一运行时包的类
才能互相访问包可见(默认访问级别)的类和类成员
10>在自定义类加载器的时候,我们必须重写findClass()方法,然后要注意 要写一个loadClassData()方法,用于读取class文件,并将其转换为二进制数据,然后在findClass()方法中调用defineClass()将二进制数据转换为Class的实例。具体代码请看自定义类加载器详情