每个类都是通过ClassLoader加载到JVM当中的。ClassLoader包括三类,分别是:
Bootstrap ClassLoader:用于加载JAVA_HOME\lib下面的jar包里的类;
Extension ClassLoader:用于加载JAVA_HOME\lib\ext下面的jar包里的类;
Application ClassLoader:用于加载其它的类。
自定义ClassLoader,继承自Application ClassLoader,Application ClassLoader实现了双亲委派模型,双亲委派模型的意思就是:如果一个类加载器收到一个加载类的请求,它会先委派给父类的加载器去加载这个类,如果父类加载器找不到这个类,它才会自己加载。
自定义ClassLoader的原理就是重写findClass这个方法,在findClass中:
1)首先,通过参数中的类全限定名称,把这个类的.class文件读进来,转成字节数组;
2)然后,通过Application ClassLoader当中defindClass方法,把这个字节数组转成对象。
对于任意一个类,都需要由加载他的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类命名空间。这句话可以表达的更通俗一些:比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来自同一个Class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那这个两个类就必定不相等。
唯一确定一个类是通过他的类加载器和全限定名。
通过线程上下文类加载器(Thread Context ClassLoader)可以打破双亲委派模型,让父类加载器加载子类加载器的类。
网友评论