类加载器
Posted zhaoyanhaoblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类加载器相关的知识,希望对你有一定的参考价值。
1.系统提供三个类加载器
下面是三种类加载器加载类文件的地方:
1) BootstrapClassLoader(启动类加载器)Bootstrap类加载器 – JRE/lib/rt.jar(开发时候用的核心类)
2) ExtensionClassLoader(标准扩展类加载器)Extension类加载器 – JRE/lib/ext或者java.ext.dirs指向的目录(扩展包)
3) AppClassLoader(系统类加载器) Application类加载器 – 加载ClassPath中jar包和class文件
MyClassLoader都是AppClassLoader加载器的子类
4)CustomClassLoader(自定义加载器)
属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现。
2.这三个类加载器是树状结构
3.类加载过程:
一个类A是由一个类加载器加载的,如果类A中使用了类B,类B也是由类A的加载器所加载
4.类加载器的工作原理是基于委托机制的:
发起者类加载器 去加载类的时候,先委托其给父类加载,如果还有父类加载器,则继续委托上去,直到没有父加载器为止,
最顶层的类加载器需要真正的去加载指定类,如果在其目录中找不到这个类,继续往下查找,直到发起者类加载器为止。
委托机制的好处是:
可以让代码更加安全!
(无论new多少个类实例,内存中只加载一次类文件(字节码文件))
5. 类加载器的顺序
1)加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载
就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
2)在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。
3)Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null。
在类的加载过程中,静态成员类的对象,会优先加载;而普通成员类的对象则是使用的时候才回去加载。
6.一个web的servlet的加载顺序:
1)WebappClassLoader(tomcat自定义类加载器):
加载web/WEB-INF/classes/ 类
加载web/WEB-INF/lib/ *.jar jar包
WebappClassLoader的设计的目录为了分离服务器中每个web应用,让每个web应用互不干扰
打破了委托机制,为了保持优先加载当前web应用的所有资源
2)StandardClassLoader:((tomcat自定义类加载器))加载tomcat/lib/*.jar
用户加载所有的web用到的jar包或类
3)AppClassLoader:classpath为空的,失效的,在这里用不到,因为WebappClassLoader已经加载了classpath的类
4)ExtClassLoader
5)BoosStrap
以上是关于类加载器的主要内容,如果未能解决你的问题,请参考以下文章