1、类加载
定义:Java虚拟机把描述类的数据加载到内存里面,并且对数据进行校验、解析和初始化,最终变成可以被虚拟机直接使用的class对象。
过程:1、通过全类名获得该类的二进制流。
2、将该二进制流的静态存储结构转为方法区的运行时的数据结构。
3、在堆中为该类生成一个class对象。
2、类加载器
定义:类加载器是指通过一个类的全类名获取该类的二进制字节流叫做类加载器。
类加载器可以分为以下4种:
1、启动类加载器(BootStrapClassLoader):用来加载Java核心类库,无法被Java程序直接引用。
2、扩展加载器(ExtensionClassLoader):用来加载Java的扩展库,Java的虚拟机实现会提供一个扩展库目录,该类加载器在扩展库目录里面查找并加载Java类。
3、系统类加载器(AppClassLoader):它根据Java的类路径来加载类,一般来说,Java应用的类都是通过它来加载的。
4、自定义加载器:由Java语言实现,继承自ClassLoader
3、双亲委派机制
Java源程序经过编译器编译成.class文件,也就是字节码文件,然后类加载器将这些字节码文件加载到JVM中执行。当一个类加载器收到一个类加载请求的时候,就会使用双亲委派机制,首先系统会判断当前类是否被加载过,已经被加载过的类会直接返回,否则才尝试加载。加载的时候。首先会把该请求委派给该父类加载器的loaderClass()处理,因此所有的请求最终都应该传送到启动累加载器BootstrapClassLoader中。当父类加载器无法处理的时候,才由自己处理。
其实这个双亲的翻译很容易让人误解,我们一般理解的双亲是指父母,这里的双亲更多的是表达“父母这一辈的”人而已,并不是说有一个Mather ClassLoader和Father ClassLoader.另外。类加载器之间的“父子关系”也不是通过继承来实现的,而是通过“优先级”来实现的。
如果不想使用双亲委派机制,我们只需要自定义类加载器,继承ClassLoader类。重写loadClass方法和findClass方法即可。比如Tomcat应用的类加载器会优先自行加载对应目录下的class,并不会委派给父类加载器,加载不了才会委派给父类加载器。
好处:保证了Java程序的稳定运行,可以避免类的重复加载,也保证了Java的核心API不被篡改。