加载:
(1) 通过一个类的全限定名获取定义此类的二进制字节流。
(2) 将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构。
(3) 在内存中生成一个代表该类的java.lang.class对象,作为方法区这个类的各种数据访问入口。
加载class文件的方式:
(1)从本地系统中直接加载
(2) 通过网络获取,例如web Applet
(3) 从zip压缩包中读取,称为jar、war格式的基础
(4) 运行时计算生成,比如动态代理技术
(5) 从其他文件生成,比如JSP应用
(6) 从专有数据库中提取.class文件,很少见
(7) 从加密文件中获取,典型的放class文件被反编译的保护措施
链接:
初始化:
- 初始化阶段就是执行类构造器方法<clinit>()的过程。<clinit>()不同于类的构造器(构造器是虚拟机视角下的<init>()),若该类有父类,JVM会保证子类的<clinit>()执行前,父类的<clinit>()已经执行完。
- 虚拟机必须保证一个类的<clinit>()方法在多线程下被同步加锁。
- 该方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。
- 任何一个类声明以后,内部至少存在一个类的构造。