类加载器
类加载器是用来把类加载到JAVA虚拟机中。
类加载的过程
类的加载过程采用了父亲委托的机制,这种机制能更好的保证JAVA平台的安全。
父亲委托机制
在此委托机制中。除了java虚拟机自带的根类加载器(Bootstrap)以外,其余的都有且只有一个父加载器。当Java程序请求加载器加载类时,加载器收先委托自己的父加载器加载该类,若父类加载器能加载,则有父类加载加载,否则只能由加载器自身加载。
Java虚拟机自带的类加载器:
(1)根类(Bootstrap)类加载器: 该加载器没有父加载器。它负责加载虚拟机的核心类库,如java.lang.*。根类加载器从系统属性sun.boot.class.path 锁指定的目录中加载类库。跟类加载器的实现依赖于底层操作系统,属于虚拟机实现的一部分,它并没有继承java.lang.ClassLoader类。
(1) 获取Bootstrap类加载器加载路径:
public class ClassLoadTestMain {
public static void main(String[] args) {
String classPath = System.getProperty("sun.boot.class.path");
String[] paths = classPath.split(":");
for (String path : paths) {
System.out.println(path);
}
}
}
![](https://img.haomeiwen.com/i15934416/9991ec5fd4514696.png)
由此可知 Bootstrap 类加载器主要加载 jre/lib/**下的核心类库。
(2)扩展(Extension)类加载器: 它的父加载器是根类加载器。它从java.ext.dirs系统属性所指定的目录中加载类库,或者从JDK的安装目录的 jre\lib\ext子目录下加载类库,如果把用户创建的JAR文件放大该目录下,也会由扩展类加载器加载。扩展类加载器是纯Java类,是java.lang.ClassLoader类的子类。
(2) 获取Extension类加载器加载路径:
public static void main(String[] args) {
String classPath = System.getProperty("java.ext.dirs");
String[] paths = classPath.split(":");
for (String path : paths) {
System.out.println(path);
}
}
![](https://img.haomeiwen.com/i15934416/0518562332a306c8.png)
(3)系统类加载器:也成为应用类加载器,它的父类加载器是扩展类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,它是用户自定义的类加载器的默认父类加载器。系统类加载器是纯java类,是java.lang.ClassLoader类的子类。
public static void main(String[] args) {
String classPath = System.getProperty("java.class.path");
String[] paths = classPath.split(":");
for (String path : paths) {
System.out.println(path);
}
}
![](https://img.haomeiwen.com/i15934416/2a29237a80bb6f5e.png)
父类委托模型图
![](https://img.haomeiwen.com/i15934416/45428449de1539ec.png)
父亲委托机制的优点:
能够提高软件系统的去安全性。在此机制下自定义的类加载器不可能加载应该有父类加载器加载的可靠类,从而防止不可靠甚至恶意代码代替由父加载器加载的可靠代码。
网友评论