- 浏览: 457067 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (354)
- 面向对象分析设计/系统架构 (12)
- Mysql/Orcal11g (13)
- JSP/Java//Python/Xharbour (66)
- 软件测试 (21)
- 信息安全小知识 (1)
- Android (5)
- IT生活/哲学/兵法 (23)
- 软件工程/UML/需求分析学习与实践 (6)
- 操作系统/网络/组成原理 (9)
- 持续集成Maven/Hudson/自动化测试 (9)
- eBay /Paypal developer (10)
- Hadoop/HBase/Solr (0)
- 重构分析及其思考 (2)
- 企业架构 (7)
- 分析模式/设计模式 (4)
- SSH学习笔记 (1)
- Quartz及其JWatch监控 (0)
- Linux服务器 (0)
- ExtJs学习笔记 (1)
- 重读java编程思想 (3)
- ESB/SOA/WebServices (0)
- SpringMVC/Struts/Hibernate/Spring (7)
- Xharbour/Pelles C/ SQLite3 (0)
- Magento 电商 (1)
- Object C (1)
- note/redis (0)
- SpringBoot (0)
最新评论
-
snow8261:
太粗略了。
企业架构之数据架构 -
haithink:
面试成功没?
JVM 加载Class文件的原理及其机制 -
feisi0003731843:
不好意思我没有重启,重启后好多了,可有的地方回放还是不成功的。 ...
Selenium IDE测试ExtJs一种测试解决办法 -
feisi0003731843:
这个好像不行吧,我试过了不好使啊。还是用id来做的。不能用啊。 ...
Selenium IDE测试ExtJs一种测试解决办法 -
yuchensuifeng:
您好,静态页面是可以的,但是,我指定error-page为js ...
JSP创建错误处理页面
由于一个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。
以上基本代码已经完成,如果有兴趣可以看看,写一个类来试试。看能不能替换。
如果真正能够明白,我想利用该机制能够很好的做好类的热运行。不在停止服务情况下,进行升级。
代码肯定不够好,希望各位好好拍。附件中有一个.pdf资料。想深入了解可以研究下。
参考的一些资料有:
http://en.wikipedia.org/wiki/Java_Classloader
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ClassLoader.html
你好能不能将你看见的那个系统发个网址给我看看。我发现现在的OSGI好像类似。但是好像和我想法不一样。我想的是通过这个加载机制进行升级系统。但是苦于没有找到一个类似的案例。
下面是我对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
- javaClassLoader.pdf (81.1 KB)
- 下载次数: 222
评论
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>
<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>
<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
热运动??好像没怎么解释这个名称哦。。对这个有点兴趣,能否解析下。
发表评论
-
java实现读取文件下所有的excel文件
2012-08-10 09:30 2089最近处理一个压缩包,里面有几百上千个excel文件。本来 ... -
在firefox浏览器下出现如果引用外部连接不存在会隐藏红叉
2012-07-23 15:38 993在firefox下引用出错的一些图片会隐藏红叉。而在IE下 ... -
java 字符替换的一些问题值得记录下
2011-09-30 16:40 884最近在处理一些字符串的替换中发生的一些问题。 最近需要临 ... -
ExtJs学习之弹出框,提示框,输入框等框
2011-06-23 22:13 93811.ExtJs之消息框: 语法:Ext.MessageB ... -
FreeMarker学习之概念
2010-08-04 10:12 860FreeMarker概述: 引用 1. ... -
HTML标准属性
2010-07-03 20:35 754核心属性(Core attributes) 以下标签 ... -
HTML标签
2010-07-03 20:14 1009HTML 4.01 / XHTML 1.0 参考手册 按字母 ... -
HTML基础
2010-07-03 00:54 772基于Web前端技术是有HTML静态语言向现在的JaveSc ... -
Struts2的开发规范和技巧
2010-05-28 14:56 1240基于Struts2的开发,如果没有足够的经验和规范做支撑,并不 ... -
第一次的Struts2的一个异常记录
2010-05-28 14:22 1051在配置正确struts.xml、web.xml、Action类 ... -
Java处理Excel全解一
2010-05-25 10:00 2190在获取客户需求的时候 ... -
Java EE 6 规范之平台概述
2010-05-22 21:28 2213JavaTM平台企业版(Java EETM)的概述 体系结构 ... -
Python3入门学习
2010-05-14 14:51 2237在学习一门计算机语言的时候,首先接触的入门程序基本上都是& ... -
Python3操作文件,目录和路径
2010-05-14 11:48 35081.遍历文件夹和文件 ... -
内存溢出
2010-04-22 14:23 1425java SE应用程序共同的问 ... -
JPA之ManyToMany的处理
2010-04-18 14:17 4513在处理关系中,最为麻烦的可能是多对多的关系处理,因为多对多 ... -
JPA之OneToOne关系处理
2010-04-18 14:05 3943在很早学习关系数据库的时候学过一对多,多对一,一对一,多对多的 ... -
JPA之OneToMany和ManyToOne处理
2010-04-18 13:52 18928前面介绍和总结了JPA ... -
JPA学习之二(入门篇)
2010-04-16 10:48 3762简单总结下,JPA的入门。在学习JPA的时候运用参考Hib ... -
JPA2.0的学习一
2010-04-15 17:18 8634Java EE 5平台引入了Java ...
相关推荐
PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!)PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!)PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!) 郑重声明:此软件不能合并PDF,合并工具请下载...
【无缝滚动插件版,欢迎拍砖!】 无缝滚动,又称无限滚动或自动滚动,是一种网页设计中的技术,使得网页内容能够连续不断地滚动显示,无需用户手动翻页。这种效果常用于新闻网站、社交媒体和电商网站,为用户提供...
集团IT信息化五年规划,参考别人的,欢迎大家拍砖!!!!!!
”按钮,如果一切正常,那么可以看到游戏效果--经典的拍砖游戏!所有代码注释非常详细,一行注释一行代码,是学习Windows编程的启步示例。 阅读对象:希望进行Windows游戏开发的人员,具备Java游戏开发基础和经验;...
最近跟模拟串口怼上了,模拟!模拟!模拟!重要的事情说三遍,这次折腾的是STM8,在网上找了各种模拟串口的例程,无奈人笨理解能力不佳,几乎都不是...要分只要良心价,你拿着这源码,如果测试不出效果,欢迎拍砖嘞!!!
由于是晚上用相机随便拍的(没有考虑到给他人用),所以效果不好,但内容是全的,想到还有很多人需要这个,所以分享出来,请不要拍砖啊! 此压缩文件有5个部分(因上传权限所致),所以请下全后解压缩即可(我用的...
由于是晚上用相机随便拍的(没有考虑到给他人用),所以效果不好,但内容是全的,想到还有很多人需要这个,所以分享出来,请不要拍砖啊! 此压缩文件有5个部分(因上传权限所致),所以请下全后解压缩即可(我用的...
由于是晚上用相机随便拍的(没有考虑到给他人用),所以效果不好,但内容是全的,想到还有很多人需要这个,所以分享出来,请不要拍砖啊! 此压缩文件有5个部分(因上传权限所致),所以请下全后解压缩即可(我用的...
由于是晚上用相机随便拍的(没有考虑到给他人用),所以效果不好,但内容是全的,想到还有很多人需要这个,所以分享出来,请不要拍砖啊! 此压缩文件有5个部分(因上传权限所致),所以请下全后解压缩即可(我用的...
由于是晚上用相机随便拍的(没有考虑到给他人用),所以效果不好,但内容是全的,想到还有很多人需要这个,所以分享出来,请不要拍砖啊! 此压缩文件有5个部分(因上传权限所致),所以请下全后解压缩即可(我用的...
C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)
星座,只用最简单的组件,与其说事游戏不如说是一个星座知识介绍~是想用j2me做游戏的初学者必看的小程序,非常简单,简单到保证你能看懂,又能从中学会一点点新得~凡是都要从简单的学起嘛~大家拍砖!!!呵呵
在"优雅的工作方式(一)——欢迎拍砖"这篇博文中,作者可能分享了自己在实际工作中如何运用源码理解和工具提升效率的心得体会,可能包括一些实战案例和经验分享。遗憾的是,由于没有具体的博客内容,无法提供更详细...
在IT行业中,遇到bug是常有的事情,"解决bug不要拍砖啊"这句话其实是在提醒开发者们,在面对问题时要保持冷静,理性分析,而非情绪化地对待。下面,我们将详细探讨bug的定义、常见类型、排查方法以及解决策略。 **1...
标题中的“新手学j2me,大牛来看看写得如何,欢迎拍砖啊”表明了这是一个关于学习Java ME(J2ME)技术的讨论,作者可能是初学者,希望得到资深开发者的意见和反馈。J2ME是Java的一个版本,主要用于开发移动设备、...
广州市 机动车道路交通违章查询!可查广东省的。 特点是,其功能可保存 3个 车牌和发动机号的记录! 方便操作。 自带简易游览器。 比起其他查询违章就更加方便了! 适合各类人操作!...原创软件 欢迎 拍砖!谢谢!!
在网络分析领域,偏移量是一个频繁出现的术语,如 IP 分段偏移量、TCP 偏移量、位 ...这些疑问,我查阅了一些 TCP/IP 书籍,并对其有了一定的了解。下面我就将我的个人理解 与大家一起共同分享。欢迎拍砖啊! :)
由于很多网友购买了或者下载java web编程宝典(十年典藏版)的电子书和源代码,但是源代码中没有给jar包我整理了所有的jar包给大家!不一定非得此书的源码能用上,在其他项目中这些jar包还是很有收藏...下错了不要拍砖!
由于很多网友购买了或者下载java web编程宝典(十年典藏版)的电子书和源代码,但是源代码中没有给jar包我整理了所有的jar包给大家!不一定非得此书的源码能用上,在其他项目中这些jar包还是很有收藏...下错了不要拍砖!
总的来说,RadioCheckBox 是一个强大且易用的工具,为 iOS 开发者提供了一个便捷的方式来创建和管理单选框,尤其在需要自定义布局和交互的情况下,它能极大地提高开发效率和用户体验。无论你是初学者还是经验丰富的...