为什么使用双亲委派模型?
ClassLoader在加载类的时候,必须先把任务委托给父类加载器,如果说父类加载器没有加载到这个类的时候,就反回来委托给它的发起者,又发起者自己本身来加载这个类,如果自己都没有加载成功的话,就会报类加载不到异常ClassNotFoundException,使用双亲委派模型主要是为了避免类的重复加载.也就是说当我们的父类已经加载这个类的时候,就没有必要子类加载这个类.
JDK已有的类加载器:
1.BootStrap ClassLoader:启动类加载器使用C++编写,主要加载lib下的rt.jar
2.Extension ClassLoader :都会继承ClassLoader,主要加载%JAVA_HOME%/lib/ext/*.jar
3.App ClassLoader:都会继承ClassLoader,主要加载ClassPath
4.自定义类加载器:也必须继承ClassLoader,完全自己定义加载路径
自定义类加载器
1.继承MyClassLoadder extends ClassLoader
2.重写findClass方法
3.定义一个成员变量,加载类的路径,可以给类加载器定义个一个名称 String path,String name,加上有参构造方法
public MyClassLoader(String name,String path){
super();//让系统类加载器称为该类的父加载器
this.name = name;
this.path = path;
}
4.加入父类加载器的构造方法
public MyClassLoader(ClassLoader parent,String name,String path){
super(parent);//显示指定父类加载器
this.name = name;
this.path = path;
}
重写findClass方法是为了加载我们自定义的类