j2se----类加载器

类加载器的管辖范围

BootStrap  ----->JRE/lib/rt.jar

ExtClassLoader ---->JRE/lib/ext/*.jar  //ext就是extends的意思

AppClassLoader ----->classpath下指定的jar

Test.class加载的执行过程是这样的,先由BootStrap来找,如果找不到再交给ExtClassLoader来找,最后再由AppClassLoader来找。。。。

这样虽然BootStrap很累,但是便于集中管理,不会出现两份相同的字节码(也不一定,如果两个平级的类加载器呢,看下面的错误哈)

面试题:能不能自己写一个类叫java.lang.System...
答:通常不可以,因为通常由于jvm的委托机制,会先调用BootStrap来加载,然而他一定能加载到一个java.lang.System,所以你写了也不会调用你的,但是我自己可以写一个类加载器,挂载到AppClassLoader上,但这个类要特殊的写法


A extends B

如果A是由ExtClassLoader来加载的,那么B只能由BootStrap 或者ExtClassLoader 加载,只能让父亲来搞,不会传播到孩子的。。。

下面看一个与类加载器有关的错误:
java.lang.ClassCastException :javax.mail.Session can not be cast to javax.mail.Session


你看这个错误邪门把。。。A不能转换成A.... 

解释:webapp/lib下面有个包,他里面有个可以new 一个Session
Session session = (Session)envCtx.lookup("mail/Dog"); 
这里左边是webapp/lib下面的Session,右边是tomcat的自己的类加载器下面的Session,注意这两个Session的类加载器是平级的,左边的是AppClassLoader,右边的是Tomcat自己的扩展Loader,所以他们的父类都没找到,所以就自己加载了,而这两份字节码是不同的字节码,所以报错了,解决的方法是把web/lib下面的干掉

再看一个错误信息:

java.lang.ClassNotFoundException: javax.mail.Authentication

这个错误时tomcat启动的时候的一个错误,是什么原因呢。。。

因为是tomcat启动的时候,所以他启动的时候加载类是到他自己的lib下面去找jar,一定不会去你的webapp/lib下面去找,所以当然找不到,即使你的工程里面有,所以我们需要把jar拷到tomcat的lib下面来。。。

你可能感兴趣的:(jvm,tomcat,面试,ext,J2SE)