随笔-0  评论-2  文章-61  trackbacks-0

classloader是分层次的,简单分为三层(由高到低):自举classloader(核心层),extension classloader(扩展classloader),applicationclassloaser(用户classloader)。另外还可以自己写classloader

  1. 自举classloader:java中的所有类都是由classloader加载的,那么classloaser自身又是怎么加载的呢?好像是矛盾的。这个问题就引出了自举classloader了,自举classloader是用本地代码写的,是jvm的一部分,它主要作用是加载java核心类,从而自举整个java环境。
  2. extension classloader:扩展classloader主要加载java扩展包中的类,如javax.naming.*等
  3. applacation classloader:用户classloader主要加载用户自己写的类,如com.ucap.xuly.*等

注意:由高层的classloader中加载的类中不能调用底层的classloader,如在java.util.*中的某个类调用javax.naming.*的类就会发生java.lang.NoClassDefFoundError的异常。(个人理解)

类的加载步骤:

  1. 在自身所属的 classloader层次中寻找该类是否被加载。若已加载就结束
  2. 委托给父类加载。
  3. 父类找到该类,则加载后结束,找不到该类则自身加载
  4. 自身所属的classloader找到该类则加载,找不到则抛出java.lang.NoClassDefFoundError的异常。

可以看出高层的classloader不会去底层的classloader中加载类的,这样可以保证核心类与用户类的独立,也可以阻止一些恶意的调用。

 

posted on 2006-12-22 09:06 comchyi 阅读(184) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: