类加载器是沙箱的第一道防线,负责将类载入JVM中。
安全作用:
一、保护善意代码不被恶意代码干扰;
二、保护已验证的类库;
三、代码放入有不同行为限制的各代码域当中。
类加载器的分类:
一、引导类加载器,Bootstrap ClassLoader (C 实现)负责核心类的加载。
二、ExtClassLoader(Laucher的内部类)
由Bootstrap ClassLoader类加载,用于装载运行环境扩展包(jre/lib/ext)中的类,而且一旦建立其加载路径将不会改变,父加载器为NULL。
三、AppClassLoader(Laucher的内部类)
父加载器为ExtClassLoader,本身也由Bootstrap ClassLoader类加载。如果程序中没有类装载相关操作设定或者自定义新的类装载器,那么编写的Java类都由此加载器装载,加载路径就是ClassPath.
四、ClassLoader
一般自定义的ClassLoader从ClassLoader继承而来。
ClassLoader的一些重要方法:
1、loadClass(String fullName,boolean resolve)
参数:fullName 要加载类的完整名(包括包名)
参数: resolve 是否需要解析类
此方法为ClassLoader的入口点。
2、final defineClass(...)
此方法是ClassLoader的主要诀窍。该方法接受由原始字节组成的数组并将其转换为Class对象。原始字节数组包含从文件系统或网络装入的数据。此方法已实现且定义为final不可覆盖。
3、final findSystemClass(...)
此方法从本地系统装入文件。
4、final resolveClass(...)
如loadClass方法的参数resolve所示,可以不完全地(不解析)装入类,也可以完全地(带解析)装入类。
5、final findLoadedClass(...)
在请求loadClass装入类时,调用此方法来查看ClassLoad是否已装入这个类,避免重复装载。