classloader 加载类
Classloader 用到的的jvm 结构 |
|||
类加载器的工作原理基于三个机制 1 委托 |
类加载器一共有三种
|
||
2 可见性 |
子类加载器加载类父类是不能看见的 根据可见性机制,子类加载器可以看到父类加载器加载的类,而反之则不行 |
||
3 单一性
1 判断findLoadedClass()方法返回的是否为null,如果不是null那么直接返回,这可以避免同一个类被加载两次; OK,通过上面的分析,我们知道要自定义一个类加载器,只需要继承ClassLoader类,然后重写它的findClass()方法即可。那么在findClass()方法中我们要完成哪些工作呢?
自定义加载器同理
findLoadedClass()---null---(代理模式委托机制)---调用每一个上级的
loadclass--找到了加载类的上级以后---findclass() FileSystemClassLoader
当Abc.class已经被Application类加载器加载过了,然后如果想要使用Extension类加载器加载这个类,将会抛出java.lang.ClassNotFoundException异常。 |
|||
4 Tomcat的类加载器 Tomcat会为每个项目提供一个类加载器,Tomcat提供的类加载器负责加载自己项目下的类,即WEB-INF\lib和WEB-INF\classes下的类。但Tomcat提供的类加载器不会使用传统的代理模式,而是自己先去加载,如果加载不到,再使用代理模式。 Tomcat提供的类加载器有这样一个好处,就是可以使自己项目下的类优先被加载! |