类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在开头有特定的文件标识
类加载器子系统只负责class文件的加载,至于是否可以运行,由Execution Engine执行引擎决定
加载的类的信息存放于一块称为方法区的内存空间中。除了类的信息外,方法区还会存放运行时常量池信息,可能还包含字符串字面量和数字常量
类加载的过程 #
加载 #
1、通过一个类的全限定名(全类名)获取此类的二进制字节流
2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区中这个类的各种数据访问入口
加载.class文件的方式 #
- 通过本地系统直接加载
- 通过网络获取,典型场景:Web、Applet
- 从zip压缩包中读取,称为日后jar、war格式的基础
- 运行时计算生成,典型场景:动态代理技术
- 由其他文件生成,典型场景:JSP
- 由专有数据库中提取
- 从加密文件中获取,典型场景:防class文件被反编译
链接 #
验证 #
目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全
主要包括四种验证:文件格式验证、元数据验证、字节码验证、符号引用验证