反射
类加载器
当JVM启动时,会形成由3个类加载器组成的初始类加载器层次结构。
-
Bootstrap ClassLoader:根类加载器。它负责加载Java的核心类。
-
Extension ClassLoader:扩展类加载器。它负责加载 JRE 的扩展目录(%JAVA_HOME%/jre/lib/ext)中JAR包的类。
-
System ClassLoader:系统类加载器。它负责在JVM启动时加载来自java命令的-classpath选项、java.class.path系统属性,或CLASSPATH环境变量所指定的JAR包和类路径。
类加载机制
-
全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他 Class 也将由该类加载器负责载入,除非显式使用另外一个类加载器来载入。
-
双亲委派,所谓父类委托,则是先让 parent父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类,双亲委派解决重复加载的问题。
-
缓存机制。缓存机制将会保证所有加载过的 Class 都会被缓存,当程序中需要使用某个 Class 时,类加载器先从缓存区中搜寻该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区中。
类的生命周期
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。
类的加载过程
-
加载:将字节码文件的二进制流加载进内存
-
验证
-
文件格式验证
-
元数据验证
-
字节码验证
-
符号引用验证
-
准备:为类变量在方法区中分配内存
-
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程
-
符号引用是以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可
-
直接引用则是指:可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。
5.到了初始化阶段, 才真正开始执行类中定义的 Java程序代码。从代码角度,初始化 阶段是执行类构造器方法的过程。