类加载机制
双亲委派机制
一般系统的默认应用加载器为AppClassLoader,它加载它负责加载用户类路径(ClassPath)所指定的类。
当加载一个类时,首先由AppClassLoader去尝试加载,AppClassLoader会去找它的父一级加载器,这里的父一级加载器不是指继承关系,而是AppClassLoader有一个成员变量叫parent。让parent去尝试加载,parent也会让parent的parent去尝试加载。
总的来说,AppClassLoader加载类时,会让ExtClassLoader先去尝试加载,ExtClassLoader加载类时,先会让BootStrapClassLoader尝试加载。
BootStrapClassLoader是顶层的加载器,看被加载类是否在JDK\jre\lib,不在就加载不了,当它尝试加载不了时,
给ExtClassLoader加载,看看被加载的类是否在 JDK\jre\lib\ext目录中,在则加载,否则交由 AppClassLoader 加载,AppClassLoader加载时看被加载的类是否在用户类路径(ClassPath)中,不在,则表示找不到,报错ClassNotFunded.
双亲委派机制的好处是安全:
曾经没有双亲委派机制时,有人自己编写了一个String类,全限定名是“java.lang.String” ,跟jdk源码中的一模一样。AppClassLoader没有使用双亲委派机制,直接就加载了它,导致系统中定义的String 被用户自定义的String替换了。双亲委派机制保护了jdk源码的类正确的被加载而不会被用户自定义的类替换掉。
- 类加载是缓存机制的,jvm会先从缓存中去取类的class文件。
- 类加载的是指类的class字节码文件被读到内存中,放在jvm的方法区,并在堆上创建类的class对象。