类加载器,总结。
第一,三种类加载器的加载范围
1.bootStrap
加载器中的祖宗类,不属于java类,是c++语言所编写,主要是rt。jar包里面的java类
2.extClassloader
bootStrap的子级别,j属于java类,是appclassloader的父级别,主要加载范围是 ext下面的所有jar包!
3.appClassLoader
此加载器,主要加载ClassPath指定的所有目录下的jar!!
4,加载器的优先级,
首先是当前线程
当父类加载器跟子类加载器的目录下都有同样的字节码文件,那么,由于委托机制原理,子类会先向上委托,当父类找完了,没有找到相关文件,才会向下交给子类加载器,如果父类加载器找到了那一份文件,则子类加载器不会再继续加载文件!
5.自定义类加载器!
自定义类加载器要继承一个类ClassLoader,然后复习findclass方法。注意为什么不复写loadClass,
因为loadClass有委托机制,它内部会向上委托,调用父类的方法去加载文件,父类没有找到在向下递交给子类,一直往下递交,直到发起者依然没有加载到相关文件,那么就会抛出异常!如果复写了loadClass,那么这个委托机制将无效!!如果不想其他类加载器去加载这文件,那么就可以复写这个方法!或者在自定义的加载器中,写上解密方法,把文件加密后,那么只有自己的类加载器能正常加载!自定义类加载器,要给他指定一个父级,构造函数不传的话,会指定一个默认的父级!
6.面试题:
我们可以不可以自己写一个java。lang。system。?通常不可以,因为父类加载器已经有一个字节码,永远不会加载你写的那份,由于委托机制原理!
7.类加载器的高级问题 分析
tomcat是一个大型的java程序,在它启动运行的时候,就开启了很多类加载器,tomact里面的加载器,
先委托给extclassLoader,然后向下返回给appClassLoader,再向下返回给standardClassLoader,再向下递交给他自己WebappClassloader!,当把tamcat的文件拷贝到jdk ext文件夹下面的话,再运行tomcat,就会报错找不到httpservlet错误,这种情况只要把servlet。jar也放到ext文件夹下面,就可以解决了!
大家互相交流
|
|