`
jiangduxi
  • 浏览: 457050 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JavaClassLoader的一些热运用(来拍砖吧!)

阅读更多
  由于一个JDBC的基本封装引来众多砖块,其实对本人来说是好事!毕竟能够学到点东西。由于在使用到Class.forName()方法,就进而对Class Loader有了疑惑,因此查阅了一些资料,这里来进行个人学习的总结。不过如果有建议或者拍砖。本人非常感谢!

  下面是我对Class Loader进行一点总结

在Java中,类的实例化流程分为两个部分:类的加载和类的实例化。类的加载分为显式加载和隐式加载。大家都知道使用new关键字创建类实例,那么new其实属于隐式地包含了类的加载过程。那么什么又是显式的加载呢?其实Class.forName就是一个最常用的。不管隐式还是显式都是通过调用ClassLoader类的loadClass方法来完成类的实际加载工作。但是如果直接调用ClassLoader的loadClass方法是一种不常见的显式加载类的技术。但是现在也在一些框架中使用了。

这样看起来好像ClassLoade没什么内涵。但是细心去研究发现其实Java类加载器是有层次的。ClassLoader在加载类时有一定的层次关系和规则。在Java中,有四种类型的加载器,分别是 Bootstrap class loader、Extensions class loader、System class loader以及用户自定义的类加载器。现在来看看上面四种类型的加载器的职责。
引用

1. Bootstrap Class loader:该类加载器层次结构的最高层,直接负责<JAVA_HOME>/lib目录下的的核心API或-Xbootclasspath选项指定的jar包。

2. Extensions Class Loader:该类主要负责默认为<JAVA_HOME>/lib/ext目录或者-Djava.ext.dirs指定目录下的jar包加载。

3. System class loader:主要负责加载路径为java.class.path,默认为环境变量CLASSPATH中设定的值。

4. 用户自定义的类加载:根据用户的需要定制自己的类加载过程,在运行期进行指定类的动态实时加载。

大致就这四种那个类的加载。问题是他们有层次。看看他们在加载过程:
加载类的顺序:
引用

Bootstrap Class loader --> Extensions Class Loader -->System class loader ---->用户自定义的类加载;他们都是在直接的加载路径上进行加载。

对类是否加载过进行判断的过程则是加载类的逆序。

每个类加载器都有直接的名字空间,对于同一个类加载器实例来说,名字相同的类只能存在一个,并且仅仅加载一次。不管该类有没有变化,下次再需要加载时候,它只是从自己的缓存中直接返回已经加载过的类引用。我们自己编写的类默认情况下都是通过System ClassLoader进行加载的。当我们使用new关键字或者class.forName来加载类时,所有加载的类则调用SystemClassLoader进行加载。
通过上面的分析大概知道了一点类的加载机制了吧。以及各自的加载路径。
引用

设想:
  既然知道我们知道类的加载机制和不同加载路径。我们是否会想到一个这样的问题。就是我们常常用SVN类纪录代码的版本。我们能不能利用类的加载机制来尝试加载一个类的不同版本的共存呢?利用不同类的加载机制和类加载机制的路径来加载该类的另外一个不同的版本呢?因此为了充分发挥用户自定义类加载机制,以下将试试利用自己的类加载器,对类的过程进行加载和控制和管理。


实施步骤:
1. 编写自定义的类加载
      分析得出编写自定义的类加载器,必须要去继承ClassLoader。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashSet;

/**
 * Description: 1. 要实现同一个类的不同版本的共存,那么这些不同版本必须有不同的类加载器进行加载
 *              2. 不能采用默认的加载器来进行加载类
 * @author Developer
 */
public class CustomerClassLoader extends ClassLoader {
	private String basedir; //需要该类加载器直接加载的类文件的基目录
	private HashSet dynaclazz; //需要由该类加载器直接加载的类名
	
	public CustomerClassLoader(String basedir,String[] clazz) throws IOException{
		super(null);//防止父类进行加载
		this.basedir = basedir;
		dynaclazz = new HashSet();
		loadClassByMe(clazz);
	}
	
	/**
	 * 
	 * @param clazns
	 * @throws IOException 
	 */
	private void loadClassByMe(String[] clazns) throws IOException{
		for(int i=0;i<clazns.length ; i++){
			loadDirectly(clazns[i]);
			dynaclazz.add(clazns[i]);
		}
	}
  
	
	 /**
	  * 
	  * @param name
	  * @return
	 * @throws IOException 
	  */
	private Class loadDirectly(String name) throws IOException {
       Class cls = null;
       StringBuffer sb = new StringBuffer(basedir);
       String classname = name.replace('.', File.separatorChar)+".class";
       sb.append(File.separator + classname);
       File classF = new File(sb.toString());
       cls = instantiateClass(name,new FileInputStream(classF),classF.length());
       return cls;
	}
	
	/**
	 * 
	 * @param name
	 * @param fileInputStream
	 * @param len
	 * @return
	 * @throws IOException
	 */

	private Class instantiateClass(String name,
			FileInputStream fileInputStream, long len) throws IOException {
		  byte[] raw = new byte[(int)len];
		  fileInputStream.read(raw);
          fileInputStream.close();
		return  defineClass(name,raw,0,raw.length);
	}
	
	protected Class loadClass(String name,boolean resolve)throws ClassNotFoundException{
		Class cls = null;
		cls = findLoadedClass(name);
		 if(!this.dynaclazz.contains(name) && cls == null)
			 cls = getSystemClassLoader().loadClass(name);
		 if(cls == null)
			 throw new ClassNotFoundException(name);
		 if(resolve)
			 resolveClass(cls);
		return cls;
		
	}
}

以上基本代码已经完成,如果有兴趣可以看看,写一个类来试试。看能不能替换。
如果真正能够明白,我想利用该机制能够很好的做好类的热运行。不在停止服务情况下,进行升级。
代码肯定不够好,希望各位好好拍。附件中有一个.pdf资料。想深入了解可以研究下。

参考的一些资料有:
http://en.wikipedia.org/wiki/Java_Classloader
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ClassLoader.html
分享到:
评论
8 楼 zgz888 2010-03-13  
我前几天刚在IBM的开发网站上看过
7 楼 jiangduxi 2010-03-13  
xiezuoming 写道
lz的这种想法很好,我好像看到有这样实现升级的系统【那是一个老外写的系统】。
jiangduxi 写道

以上基本代码已经完成,如果有兴趣可以看看,写一个类来试试。看能不能替换。
如果真正能够明白,我想利用该机制能够很好的做好类的热运行。不在停止服务情况下,进行升级。


你好能不能将你看见的那个系统发个网址给我看看。我发现现在的OSGI好像类似。但是好像和我想法不一样。我想的是通过这个加载机制进行升级系统。但是苦于没有找到一个类似的案例。
6 楼 xiezuoming 2010-03-13  
lz的这种想法很好,我好像看到有这样实现升级的系统【那是一个老外写的系统】。
jiangduxi 写道

以上基本代码已经完成,如果有兴趣可以看看,写一个类来试试。看能不能替换。
如果真正能够明白,我想利用该机制能够很好的做好类的热运行。不在停止服务情况下,进行升级。

5 楼 kingwon 2010-03-12  
perm区就是放这些的地方
4 楼 asialee 2010-03-12  
<div class="quote_title">pw04_5 写道</div>
<div class="quote_div">
<div class="quote_title">写道</div>
<div class="quote_div">每个类加载器都有直接的名字空间,对于同一个类加载器实例来说,名字相同的类只能存在一个,并且仅仅加载一次。不管该类有没有变化,下次再需要加载时候,它只是从自己的缓存中直接返回已经加载过的类引用。</div>
<p> </p>
<p> <span style="color: #ff6600;">仅仅加载一次,下次再需要加载时</span>,这样的说法是否有矛盾?</p>
</div>
<p>这个指的是从缓存读取,就是class文件加载一次。</p>
3 楼 pw04_5 2010-03-12  
<div class="quote_title">写道</div>
<div class="quote_div">每个类加载器都有直接的名字空间,对于同一个类加载器实例来说,名字相同的类只能存在一个,并且仅仅加载一次。不管该类有没有变化,下次再需要加载时候,它只是从自己的缓存中直接返回已经加载过的类引用。</div>
<p> </p>
<p> <span style="color: #ff6600;">仅仅加载一次,下次再需要加载时</span>,这样的说法是否有矛盾?</p>
2 楼 swen00 2010-03-12  
http://www.iteye.com/topic/612437
这里有些讨论
1 楼 zhxing 2010-03-12  
热运动??好像没怎么解释这个名称哦。。对这个有点兴趣,能否解析下。

相关推荐

    PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!)

    PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!)PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!)PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!) 郑重声明:此软件不能合并PDF,合并工具请下载...

    无缝滚动插件版,欢迎拍砖!

    【无缝滚动插件版,欢迎拍砖!】 无缝滚动,又称无限滚动或自动滚动,是一种网页设计中的技术,使得网页内容能够连续不断地滚动显示,无需用户手动翻页。这种效果常用于新闻网站、社交媒体和电商网站,为用户提供...

    集团IT信息化五年规划

    集团IT信息化五年规划,参考别人的,欢迎大家拍砖!!!!!!

    翻写拍砖游戏--说明Windows编程原理

    ”按钮,如果一切正常,那么可以看到游戏效果--经典的拍砖游戏!所有代码注释非常详细,一行注释一行代码,是学习Windows编程的启步示例。 阅读对象:希望进行Windows游戏开发的人员,具备Java游戏开发基础和经验;...

    stm8s_simulation_uart.7z

    最近跟模拟串口怼上了,模拟!模拟!模拟!重要的事情说三遍,这次折腾的是STM8,在网上找了各种模拟串口的例程,无奈人笨理解能力不佳,几乎都不是...要分只要良心价,你拿着这源码,如果测试不出效果,欢迎拍砖嘞!!!

    Visual C++ 2008 入门经典(268-367页)压缩文件第3部分

    由于是晚上用相机随便拍的(没有考虑到给他人用),所以效果不好,但内容是全的,想到还有很多人需要这个,所以分享出来,请不要拍砖啊! 此压缩文件有5个部分(因上传权限所致),所以请下全后解压缩即可(我用的...

    Visual C++ 2008 入门经典(268-367页)压缩文件第1部分

    由于是晚上用相机随便拍的(没有考虑到给他人用),所以效果不好,但内容是全的,想到还有很多人需要这个,所以分享出来,请不要拍砖啊! 此压缩文件有5个部分(因上传权限所致),所以请下全后解压缩即可(我用的...

    Visual c++ 2008 入门经典(268-367页)压缩文件第2部分

    由于是晚上用相机随便拍的(没有考虑到给他人用),所以效果不好,但内容是全的,想到还有很多人需要这个,所以分享出来,请不要拍砖啊! 此压缩文件有5个部分(因上传权限所致),所以请下全后解压缩即可(我用的...

    Visual C++ 2008 入门经典(268-367页)压缩文件第5部分

    由于是晚上用相机随便拍的(没有考虑到给他人用),所以效果不好,但内容是全的,想到还有很多人需要这个,所以分享出来,请不要拍砖啊! 此压缩文件有5个部分(因上传权限所致),所以请下全后解压缩即可(我用的...

    Visual C++ 2008 入门经典(268-367页)压缩文件第4部分

    由于是晚上用相机随便拍的(没有考虑到给他人用),所以效果不好,但内容是全的,想到还有很多人需要这个,所以分享出来,请不要拍砖啊! 此压缩文件有5个部分(因上传权限所致),所以请下全后解压缩即可(我用的...

    C#编写的计算器(高手拍砖)

    C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)

    基于Eclipse开发的j2me小游戏---星座(最最简单的)

    星座,只用最简单的组件,与其说事游戏不如说是一个星座知识介绍~是想用j2me做游戏的初学者必看的小程序,非常简单,简单到保证你能看懂,又能从中学会一点点新得~凡是都要从简单的学起嘛~大家拍砖!!!呵呵

    优雅的工作方式(一)——欢迎拍砖

    在"优雅的工作方式(一)——欢迎拍砖"这篇博文中,作者可能分享了自己在实际工作中如何运用源码理解和工具提升效率的心得体会,可能包括一些实战案例和经验分享。遗憾的是,由于没有具体的博客内容,无法提供更详细...

    解决bug不要拍砖啊

    在IT行业中,遇到bug是常有的事情,"解决bug不要拍砖啊"这句话其实是在提醒开发者们,在面对问题时要保持冷静,理性分析,而非情绪化地对待。下面,我们将详细探讨bug的定义、常见类型、排查方法以及解决策略。 **1...

    新手学j2me,大牛来看看写得如何,欢迎拍砖啊

    标题中的“新手学j2me,大牛来看看写得如何,欢迎拍砖啊”表明了这是一个关于学习Java ME(J2ME)技术的讨论,作者可能是初学者,希望得到资深开发者的意见和反馈。J2ME是Java的一个版本,主要用于开发移动设备、...

    广州市机动车道路交通违法查询 v1.0软件 (可保存车牌和发动机号)

    广州市 机动车道路交通违章查询!可查广东省的。 特点是,其功能可保存 3个 车牌和发动机号的记录! 方便操作。 自带简易游览器。 比起其他查询违章就更加方便了! 适合各类人操作!...原创软件 欢迎 拍砖!谢谢!!

    偏移量详解 - 网络分析

    在网络分析领域,偏移量是一个频繁出现的术语,如 IP 分段偏移量、TCP 偏移量、位 ...这些疑问,我查阅了一些 TCP/IP 书籍,并对其有了一定的了解。下面我就将我的个人理解 与大家一起共同分享。欢迎拍砖啊! :)

    java web编程宝典(十年典藏版)源码的JAR包第一部分

    由于很多网友购买了或者下载java web编程宝典(十年典藏版)的电子书和源代码,但是源代码中没有给jar包我整理了所有的jar包给大家!不一定非得此书的源码能用上,在其他项目中这些jar包还是很有收藏...下错了不要拍砖!

    java web编程宝典(十年典藏版)源码JAR包第二部分

    由于很多网友购买了或者下载java web编程宝典(十年典藏版)的电子书和源代码,但是源代码中没有给jar包我整理了所有的jar包给大家!不一定非得此书的源码能用上,在其他项目中这些jar包还是很有收藏...下错了不要拍砖!

    RadioCheckBox:iOS 单选框,可自定义横向和纵向显示,可定义显示的个数和内容,自定义间距,提供block 和代理方法可供使用,欢迎拍砖!

    总的来说,RadioCheckBox 是一个强大且易用的工具,为 iOS 开发者提供了一个便捷的方式来创建和管理单选框,尤其在需要自定义布局和交互的情况下,它能极大地提高开发效率和用户体验。无论你是初学者还是经验丰富的...

Global site tag (gtag.js) - Google Analytics