面试中会经常问到四种类加载器还有双亲委派机制。
首先了解下四种类加载器。
启动类加载器(
Bootstrap ClassLoader
):由C++
语言实现(针对HotSpot
),负责将存放在<JAVA_HOME>\lib
目录或-Xbootclasspath
参数指定的路径中的类库加载到内存中。其他类加载器:由
Java
语言实现,继承自抽象类ClassLoader
。如:- 扩展类加载器(
Extension ClassLoader
):负责加载<JAVA_HOME>\lib\ext
目录或java.ext.dirs
系统变量指定的路径中的所有类库。 - 应用程序类加载器(
Application ClassLoader
)。负责加载用户类路径(classpath
)上的指定类库,我们可以直接使用这个类加载器。一般情况,如果我们没有自定义类加载器默认就是用这个加载器。 - 自定义类加载器,自己写代码决定加载哪个类
- 扩展类加载器(
2双亲委派机制很好理解,就是加载一个类时,自己先不加载,交给自己的父亲,爸爸搞不定就爷爷(bootstrap classloader)来. 只有当他们俩都加载不了的时候,才轮到自己加载。
好处就是保证系统的安全,类的唯一。试想黑客自定义一个java.lang.String
类,该String
类具有系统的String
类一样的功能,只是在某个函数稍作修改。比如equals
函数,这个函数经常使用,如果在这这个函数中,黑客加入一些“病毒代码”。并且通过自定义类加载器加入到JVM
中。此时,如果没有双亲委派模型,那么JVM
就可能误以为黑客自定义的java.lang.String
类是系统的String
类,导致“病毒代码”被执行。