1.类加载器简介:
类加载器,即ClassLoader,它负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。
2.类加载器分类:
虚拟机自带的类加载器:
- 启动类加载器(BootStrap):主要负责加载jre中最基础、最重要的类。如 $JAVA_HOME/jre/lib/rt.jar 等,以及由虚拟机参数 -Xbootclasspath 指定的类。由于它由C++代码实现,没有对应的java对象,因此在java中,尝试获取此类时,只能使用null来代替。
- 扩展类加载器(Extension):由Java代码实现,用于加载相对次要、但是又通用的类,比如存放在JRE的lib/ext目录下jar包中的类,以及由系统变量 java.ext.dirs 指定的类。如 $JAVA_HOME/jre/lib/ext/*.jar。
- 应用程序类加载器(AppClassLoder):由Java代码实现,负责加载用应用程序路径下的类。(这里的应用程序路径,便是指虚拟机参数 -cp/classpath、系统变量 java.class.path 或环境变量 CLASSPATH 所指定的路径)默认情况下,应用程序中包含的类便是由应用类加载器加载的。
用户自定义的类加载器:
- Java.lang.ClassLoder的子类,用户可以定制类的加载方式。例如:可以对class文件进行加密,加载时再利用自定义的类加载器对其解密。
- 除了BootStrap Class Loader,其他的类加载器,都是Java.lang.ClassLoader的子类。其他的类加载器都是由sum.misc.Launcher类加载后得到。
3.双亲委派机制:
双亲委派模型:每当一个类加载器接收到加载请求时,它会先将请求转发给父类加载器。在父类加载器没有找到所请求的类的情况下,该类加载器才会尝试去加载。
双亲委派机制作用:
- 采用双亲委派模式可以让
Java
类随着他的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关系可以避免类的重复加载,当父类已经加载了该类时,就没必要子类的ClassLoader再进行加载。 - 考虑到安全因素,防止Java核心API中定义类型不会被用户恶意替换和篡改,从而引发错误。