classloader是分层次的,简单分为三层(由高到低):自举classloader(核心层),extension classloader(扩展classloader),applicationclassloaser(用户classloader)。另外还可以自己写classloader
-
自举classloader:java中的所有类都是由classloader加载的,那么classloaser自身又是怎么加载的呢?好像是矛盾的。这个问题就引出了自举classloader了,自举classloader是用本地代码写的,是jvm的一部分,它主要作用是加载java核心类,从而自举整个java环境。
-
extension classloader:扩展classloader主要加载java扩展包中的类,如javax.naming.*等
-
applacation classloader:用户classloader主要加载用户自己写的类,如com.ucap.xuly.*等
注意:由高层的classloader中加载的类中不能调用底层的classloader,如在java.util.*中的某个类调用javax.naming.*的类就会发生java.lang.NoClassDefFoundError的异常。(个人理解)
类的加载步骤:
-
在自身所属的 classloader层次中寻找该类是否被加载。若已加载就结束
-
委托给父类加载。
-
父类找到该类,则加载后结束,找不到该类则自身加载
-
自身所属的classloader找到该类则加载,找不到则抛出java.lang.NoClassDefFoundError的异常。
可以看出高层的classloader不会去底层的classloader中加载类的,这样可以保证核心类与用户类的独立,也可以阻止一些恶意的调用。
posted on 2006-12-22 09:06
comchyi 阅读(184)
评论(0) 编辑 收藏