cuiyi's blog(崔毅 crazycy)

记录点滴 鉴往事之得失 以资于发展
数据加载中……

ClassLoader专题(一):ClassLoader基础

ClassLoader 专题(一): ClassLoader 基础

ClassLoader 专题(二):从 Servlet 容器看 ClassLoader 机制的妙用
    ClassLoader专题(三):引文 

 

JVM启动,会形成3个类加载器组成的初始化加载器层次结构:
bootstap classloader (加载核心类)
        ||
extension classloader(加载ext(目录),即java.ext.dirs())
        ||
system classloader   (加载-classpath或者java.class.path或者CLASSPATH)


ClassLoader机制:
a)全盘负责:一个classloader加载一个class后,这个class所引用或者依赖的类也由这个classloader载入,除非显示的用另一个classloader载入
b)委托机制:先由父加载器加载,除非父加载器找不到时才从自己的类路径中去寻找
c)Cache机制:classloader采用缓存机制,即先查cache;若cache中保存了这个class就直接返回;若无,才从文件读取和转化为class并放入cache

 

ClassLoader加载类顺序:
1)检查cache是否有该类:
    11)若有直接返回
    12)若无,请求父类加载
        121) 若无父,则从bootstap classloader加载
2)加载:
    21)寻找class文件(丛与此classloader相关的类路径中寻找)
    22)从文件载入class
    23)找不到则抛出ClassNotFoundeException
3)扩展:
    记载时即2),覆写findClass可以实现自己的载入策略
    记载时即2),覆写loadClass来实现自己的载入过程


如何实现运行时动态载入与更新
本质:只要动态改类搜索路径和清除classloader的cache已载入的class就ok
做法:
1)继承ClassLoader:覆写loadClass方法,动态寻找class文件
2)只要重新使用一个新的类搜索路径来new一个classloader就可以,这样既更新了类的搜索路径以便来载入新的class,也更新生成了一个空白的cache


classloader载入的方式
1)Pre-loading 预先载入,载入基础类
2)load-on-demand 按需求载入


JDK为啥有两个JRE?
JDK中jre是运行java本身的程序,如javac
ProgramFile(默认安装)中jre是运行用户编写的java程序

posted on 2007-02-01 20:48 crazycy 阅读(5058) 评论(5)  编辑  收藏 所属分类: JavaSE语言

评论

# re: ClassLoader专题一:ClassLoader基础  回复  更多评论   

ContextClassloader也很重要,

JDK为啥2个JRE?
看这里http://java.sun.com/javase/6/docs/
JDK本身包含一个JRE.
放在programfile只是为了方便,没有区别.
Unix-like系统里面一般安装就只有一个jre,也就是jdk里面的那个jre.
2007-02-01 21:02 | colorzhang

# re: ClassLoader专题(一):ClassLoader基础  回复  更多评论   

研究好了 ClassLoader 可以给自己的应用加入热切换, 热部署, 热替换功能, 那样就是高高手了!
2007-02-03 19:56 | BeanSoft

# re: ClassLoader专题(一):ClassLoader基础  回复  更多评论   

@BeanSoft
甚是啊
潜心修行中
2007-05-05 01:32 | crazycy

# re: ClassLoader专题(一):ClassLoader基础  回复  更多评论   

@colorzhang
这个地方受教了;

programfile 下的jre主要为ie等服务,呵呵
2007-05-05 01:33 | crazycy

# re: ClassLoader专题(一):ClassLoader基础  回复  更多评论   

请教下:
2)只要重新使用一个新的类搜索路径来new一个classloader就可以,这样既更新了类的搜索路径以便来载入新的class,也更新生成了一个空白的cache

“重新使用一个新的类搜索路径” , 这句是什么意思 ,能举个例子么?
2008-11-05 14:02 | hackerZxf

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


网站导航: