动态编程之classloader

04-09-17 wafodis
这个周看了很多有关classloader的文章,再加上自己的一点实践拿出来跟大家分享,如有谬误,恳请指正。首先简单介绍一下classloader的结构:每个构造好的类在某种意义上是由装入它的类装入器所“拥有”,类装入器通常保留它们所装入类的映射,从而当再次请求某个类时,能通过名称找到该类,而装载机则有可能将类保存在缓存或内存之中,每个类装入器还保留对父类装入器的引用,整个classloader结构是一个类装入器树,下层的装入器由上层的装入器装入,而这些装入器都使用java语言编成,既然这样那根装入器是被什么装进去的呢?我猜既然java语言都需要classloader装进去的话那根classloader一定不是java编写的了,可能是汇编或者c完成的(这里没查资料,不是很准确)。那么关于动态加载新的类这一主题我曾经想得很简单,觉得无非就是另起一个线程监视给定的目录然后扫入目录下的类把这些类加载进虚拟机里就行了,试验了很多次这样的想法都没成功,最后查资料才知道原因是各个线程的classloader都不一样而且不会去主动沟通,每个线程只能用到当前的classloader以及系统classloader也就是,装载环境变量classpath下设定的那些类的classloader,所以另起一个线程所加载进来的类主线程根本用不成。至于要怎么实现,可以参考IBM技术文档,也可以参考开源项目JBOSS服务器的源代码,我的看法是,他们的做法可以说是殊途同归,IBM文档上采用了继承URLClassLoader的方法,通过getSystemClassLoader()方法取得当前classloader,并把它作为父类作为参数创建自己的classloader;而JBOSS的做法更为巧妙,它将当前线程的classloader取得后暂时存起来,并且用给定URL创建的classloader取代当前classloader,当用完所需要路径下的类之后再恢复当前线程,这样就达到了把检测和调用新类的任务分离出去给子线程做的一个目的,构思很是巧妙,具体实现可以参考JBOSS的源代码,下载地址是http://prdownloads.sourceforge.net/jboss/jboss-3.0.1RC1-src.tgz?download。至于动态调用给与的新类中的各种函数的方法,要用到java的Reflection机制,相信各位都不陌生,可以查阅sun的载线文档

1
happycpa
2004-09-18 08:18
顶一下.我一直不知道在什么地方设置ClassLoader,能使用自己指定的ClassLoader

猜你喜欢