类加载器:
类加载器:通过一个类的全限定名(绝对路径)来获取这个类的二进制字节流
类加载器作用:将编译后的class文件加载到内存中
类加载器分类:
启动类加载器:加载java的基础类,但由于涉及虚拟机本地实现细节(属于虚拟机实现的一部分),所以不允许被直接引用
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
扩展类加载器:加载jre/lib/ext扩展的jar包,可以直接被使用
URL[] urls = ((URLClassLoader) ClassLoader.getSystemClassLoader().getParent()).getURLs();
应用程序类加载器:加载用户的jar包,即编写的class文件
URL[] urls = ((URLClassLoader) ClassLoader.getSystemClassLoader()).getURLs();
加载类型:
全盘负责:当一个加载器加载某个类的时候,这个类的依赖和引用也会被这个加载器加载,除非依赖的已经被其他加载器加载了。例:
A创建B,A被a加载器类加载,那么依赖于A的B也会被a加载器加载。
父类委托:向父加载器委托加载(递归进行),直到无法再被递归,避免一个类被重复加载
加载器的父子关系:
启动类加载器>扩展类加载器>系统类加载器>用户自定义加载器