一.类加载器
1.1 类加载器子系统的作用:
- 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。
- ClassLoader只负责class文件的加载,至于它是否可以运行,则由ExecutionEngine决定。
- 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法去中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件常量池部分的内存映射)
1.2 类加载器ClassLoader角色
- class file 存在于本地磁盘上,可以理解为设计师画在纸上的模板,而最终这个模板在执行的时候是要加载到JVM中来根据这个文件实例化出n个一模一样的实例。
- class file 加载到JVM中,被称为DNA元数据模板,放在方法区。
- 在 .class 文件 -> JVM -> 最终成为元数据模板,此过程就要一个运输工具(类加载器 Class Loader),扮演一个快递员的角色。
1.3 类加载过程(宏观上的概念)
简图
细化过程
1.3.1 类加载过程的Loading阶段(狭义上的加载阶段)
加载:
- 通过一个类的全限定名获取此类的二进制字节流,(以物理磁盘上的文件为例即以流的方式实现去把这个物理磁盘上的文件加载到内存区中。)
- 将这个字节流所代表的静态存储结构转化为方法去的运行时数据结构,即类要存在方法区中
3.** 在内存中生成一个代表这个类的java.lang.Class 对象**,作为方法区这个类的各种数据的访问入口。
加载.class 文件的方式
- 从本地系统中直接加载
- 通过网络获取,典型场景:Web Applet
- 从zip 压缩包中读取,成为日后jar ,war格式的基础
- 运行时计算生成,使用最多的是:动态代理技术
- 由其他文件生成,典型场景:JSP 应用
- 从专有数据库中提取.class 文件, 这种比较少见
- 从加密文件中去获取,典型的防Class文件被反编译的保护措施防止盗版