类加载的时候会有五种情况下,触发类加载
1.创建类的实例(new 一个对象的时候),访问某个类,或者接口的静态变量,或者对该类进行赋值的时候,调用该类的静态方法.
2.反射的方法,
3.初始化某个子类的时候,也会触发父类初始化.
4.java虚拟机启动的时候被标明气候某个类的类.
5.当时有JDK1.7动态语言支持的时候.
类的生命周期:
加载---验证--准备--解析--初始化--使用--卸载.
加载:通过一个类的全限定名来获取定义的二进制文件.之后转换到方法区中.
验证:这个阶段的目的是为了class文件中的字节流时候是否附后jvm的要求.来保证不会危害jvm虚拟机.
准备:准备阶段是将类的变量分配到指定的内存空间去,设置类变量初始化的阶段.(一般基本数据类型初始化为0,String初始化为null,但是final修饰的变量直接赋值).
解析:虚拟机将常量池中的符号引用直接转换为直接引用.
符号引用:符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。
直接引用:直接引用是和虚拟机实现的内存布局相关的。如果有了直接引用,那引用的目标必定已经在内存中存在.
初始化:在准备阶段已经给变量初始换一次指定的值了,在初始的时候变量赋值是程序员设计的值,进行初始化.也就是这个阶段执行类的构造器.
类的加载器:
类的加载器分为启动加载器,扩展类加载器,应用层加载器,自定义加载器.
类加载器的双亲委派机制,类加载器接收到了类加载器的请求之后先调用父类的加载器,之后一层一层的向上找,一直找到了启动加载器.每一层无法加载的时候在项回来找.