ImageVerifierCode 换一换
格式:DOC , 页数:10 ,大小:62.50KB ,
资源ID:7814837      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/7814837.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(Java类装载体系中的隔离.doc)为本站上传会员【pc****0】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

Java类装载体系中的隔离.doc

1、Java类装载体系中的隔离性 Java中类的查找与装载出现的问题总 是会时不时出现在Java程序员面前,这并不是什么丢脸的事情,相信没有一个Java程序员没遇到过ClassNotException,因此不要为被人 瞅见自己也犯这样的错误而觉得不自然,但是在如果出现了ClassNotFoundException后异常后一脸的茫然,那我想你该了解一下java的 类装载的体制了,同时为了进行下面的关于类装载器之间的隔离性的讨论,我们先简单介绍一下类装载的体系结构。   1. Java类装载体系结构   装载类的过程非常简单:查找类所在位置,并将找到的Java类的字节码装入内存,生成对应的C

2、lass对象。Java的类装载器专门用来实现这 样的过程,JVM并不止有一个类装载器,事实上,如果你愿意的话,你可以让JVM拥有无数个类装载器,当然这除了测试JVM外,我想不出还有其他的用途。 你应该已经发现到了这样一个问题,类装载器自身也是一个类,它也需要被装载到内存中来,那么这些类装载器由谁来装载呢,总得有个根吧?没错,确实存在这样 的根,它就是神龙见首不见尾的Bootstrap ClassLoader. 为什么说它神龙见首不见尾呢,因为你根本无法在Java代码中抓住哪怕是它的一点点的尾巴,尽管你能时时刻刻体会到它的存在,因为java的运行环境所需 要的所有类库,都由它来装载,而它本身是C

3、写的程序,可以独立运行,可以说是JVM的运行起点,伟大吧。在Bootstrap完成它的任务后,会生成 一个AppClassLoader(实际上之前系统还会使用扩展类装载器ExtClassLoader,它用于装载Java运行环境扩展包中的类),这个 类装载器才是我们经常使用的,可以调用ClassLoader.getSystemClassLoader() 来获得,我们假定程序中没有使用类装载器相关操作设定或者自定义新的类装载器,那么我们编写的所有java类通通会由它来装载,值得尊敬吧。 AppClassLoader查找类的区域就是耳熟能详的Classpath,也是初学者必须跨过的门槛,有没有灵

4、光一闪的感觉,我们按照它的类查找范围 给它取名为类路径类装载器。还是先前假定的情况,当Java中出现新的类,AppClassLoader首先在类传递给它的父类类装载器,也就是 Extion ClassLoader,询问它是否能够装载该类,如果能,那AppClassLoader就不干这活了,同样Extion ClassLoader在装载时,也会先问问它的父类装载器。我们可以看出类装载器实际上是一个树状的结构图,每个类装载器有自己的父亲,类装载器在装载 类时,总是先让自己的父类装载器装载(多么尊敬长辈),如果父类装载器无法装载该类时,自己就会动手装载,如果它也装载不了,那么对不起,它会大喊一 声:

5、Exception,class not found。有必要提一句,当由直接使用类路径装载器装载类失败抛出的是NoClassDefFoundException异常。如果使用自定义的类装载 器loadClass方法或者ClassLoader的findSystemClass方法装载类,如果你不去刻意改变,那么抛出的是 ClassNotFoundException。   我们简短总结一下上面的讨论:   1.JVM类装载器的体系结构可以看作是树状结构。   2.父类装载器优先装载。在父类装载器装载失败的情况下再装载,如果都装载失败则抛出ClassNotFoundException或者NoClas

6、sDefFoundError异常。   那么我们的类在什么情况下被装载的呢?   2. 类如何被装载   在java2中,JVM是如何装载类的呢,可以分为两种类型,一种是隐式的类装载,一种式显式的类装载。   2.1 隐式的类装载   隐式的类装载是编码中最常用得方式:   A b = new A();   如果程序运行到这段代码时还没有A类,那么JVM会请求装载当前类的类装器来装载类。 问题来了,我把代码弄得复杂一点点,但依旧没有任何难度,请思考JVM得装载次序:   package test;   Public class A{   public void static

7、 main(String args[]){   B b = new B();   }   }   class B{C c;}   class C{}   揭晓答案,类装载的次序为A->B,而类C根本不会被JVM理会,先不要惊讶,仔细想想,这不正是我们最需要得到的结果。我们仔细了解一 下JVM装载顺序。当使用Java A命令运行A类时,JVM会首先要求类路径类装载器(AppClassLoader)装载A类,但是这时只装载A,不会装载A中出现的其他类(B类),接 着它会调用A中的main函数,直到运行语句b = new B()时,JVM发现必须装载B类程序才能继续运行,于是类路径类装载

8、器会去装载B类,虽然我们可以看到B中有有C类的声明,但是并不是实际的执行语句, 所以并不去装载C类,也就是说JVM按照运行时的有效执行语句,来决定是否需要装载新类,从而装载尽可能少的类,这一点和编译类是不相同的。   2.2 显式的类装载   使用显示的类装载方法很多,我们都装载类test.A为例。   使用Class类的forName方法。它可以指定装载器,也可以使用装载当前类的装载器。例如:   Class.forName("test.A");   它的效果和   Class.forName("test.A",true,this.getClass().getClassLoade

9、r());   是一样的。   使用类路径类装载装载.   ClassLoader.getSystemClassLoader().loadClass("test.A");   使用当前进程上下文的使用的类装载器进行装载,这种装载类的方法常常被有着复杂类装载体系结构的系统所使用。   Thread.currentThread().getContextClassLoader().loadClass("test.A")   使用自定义的类装载器装载类   public class MyClassLoader extends URLClassLoader{   public MyCla

10、ssLoader() {   super(new URL[0]);   }   }   MyClassLoader myClassLoader = new MyClassLoader();   myClassLoader.loadClass("test.A");   MyClassLoader继承了URLClassLoader类,这是JDK核心包中的类装载器,在没有指定父类装载器的情况下,类路径类装载器就是它的父类装载器,MyClassLoader并没有增加类的查找范围,因此它和类路径装载器有相同的效果。   我们已经知道Java的类装载器体系结构为树状,多个类装载器可以指定同一

11、个类装载器作为自己的父类,每个子类装载器就是树状结构的一个分支, 当然它们又可以个有子类装载器类装载器,类装载器也可以没有父类装载器,这时Bootstrap类装载器将作为它的隐含父类,实际上Bootstrap类 装载器是所有类装载器的祖先,也是树状结构的根。这种树状体系结构,以及父类装载器优先的机制,为我们编写自定义的类装载器提供了便利,同时可以让程序按 照我们希望的方式进行类的装载。例如某个程序的类装载器体系结构图如下: 图:某个程序的类装载器的结构   解释一下上面的图,ClassLoaderA为自定义的类装载器,它的父类装载器为类路径装载器,它有两个子类装载器 ClassLo

12、aderAA和ClassLaderAB,ClassLoaderB为程序使用的另外一个类装载器,它没有父类装载器,但有一个子类装载器 ClassLoaderBB。你可能会说,见鬼,我的程序怎么会使用这么复杂的类装载器结构。为了进行下面的讨论,暂且委屈一下。  3. 奇怪的隔离性   我们不难发现,图2中的类装载器AA和AB, AB和BB,AA和B等等位于不同分支下,他们之间没有父子关系, 我不知道如何定义这种关系,姑且称他们位于不同分支下。两个位于不同分支的类装载器具有隔离性,这种隔离性使得在分别使用它们装载同一个类,也会在内存中 出现两个Class类的实例。因为被具有隔离性的类装载器装载的

13、类不会共享内存空间,使得使用一个类装载器不可能完成的任务变得可以轻 而易举,例如类的静态变量可能同时拥有多个值(虽然好像作用不大),因为就算是被装载类的同一静态变量,它们也将被保存不同的内存空间,又例如程序需要使 用某些包,但又不希望被程序另外一些包所使用,很简单,编写自定义的类装载器。类装载器的这种隔离性在许多大型的软件应用和服务程序得到了很好的应用。下 面是同一个类静态变量为不同值的例子。   package test;   public class A {   public static void main( String[] args ) {   try {   //定义

14、两个类装载器   MyClassLoader aa= new MyClassLoader();   MyClassLoader bb = new MyClassLoader();   //用类装载器aa装载testb.B类   Class clazz=aa.loadClass("testb. B");   Constructor constructor=   clazz.getConstructor(new Class[]{Integer.class});   Object object =   constructor.newInstance(new Object[]{new

15、Integer(1)});   Method method =   clazz.getDeclaredMethod("printB",new Class[0]);   //用类装载器bb装载testb.B类   Class clazz2=bb.loadClass("testb. B");   Constructor constructor2 =   clazz2.getConstructor(new Class[]{Integer.class});   Object object2 =   constructor2.newInstance(new Object[]{new In

16、teger(2)});   Method method2 =   clazz2.getDeclaredMethod("printB",new Class[0]);   //显示test.B中的静态变量的值   method.invoke( object,new Object[0]);   method2.invoke( object2,new Object[0]);   } catch ( Exception e ) {   e.printStackTrace();   }   }   }   //Class B 必须位于MyClassLoader的查找范围内,   /

17、/而不应该在MyClassLoader的父类装载器的查找范围内。   package testb;   public class B {   static int b ;   public B(Integer testb) {   b = testb.intValue();   }   public void printB() {   System.out.print("my static field b is ", b);   }   }   public class MyClassLoader extends URLClassLoader{   private st

18、atic File file = new File("c:\\classes ");   //该路径存放着class B,但是没有class A   public MyClassLoader() {   super(getUrl());   }   public static URL[] getUrl() {   try {   return new URL[]{file.toURL()};   } catch ( MalformedURLException e ) {   return new URL[0];   }   }   }   程序的运行结果为:   m

19、y static field b is 1   my static field b is 2   程序的结果非常有意思,从编程者的角度,我们甚至可以把不在同一个分支的类装载器看作不同的java虚拟机,因为它们彼此觉察不到对方的存在。 程序在使用具有分支的类装载的体系结构时要非常小心,弄清楚每个类装载器的类查找范围,尽量避免父类装载器和子类装载器的类查找范围中有相同类名的类(包 括包名和类名),下面这个例子就是用来说明这种情况可能带来的问题。   假设有相同名字却不同版本的接口 A,   版本 1:   package test;   Intefer Same{ public Str

20、ing getVersion(); }   版本 2:   Package test;   Intefer Same{ public String getName(); }   接口A两个版本的实现:   版本1的实现   package test;   public class Same1Impl implements Same {   public String getVersion(){ return "A version 1";}   }   版本2的实现   public class Same 2Impl implements Same {   public

21、String getName(){ return "A version 2";}   }   我们依然使用图2的类装载器结构,首先将版本1的Same和Same的实现类Same1Impl打成包same1.jar,将版本2的Same 和Same的实现类Same1Impl打成包same2.jar。现在,做这样的事情,把same1.jar放入类装载器ClassLoaderA的类查 找范围中,把same2.jar放入类装器ClassLoaderAB的类查找范围中。当你兴冲冲的运行下面这个看似正确的程序。   实际上这个错误的是由父类载器优先装载的机制造成,当类装载器ClassLoaderAB在装载

22、Same2Impl类时发现必须装载接口 test.Same,于是按规定请求父类装载器装载,父类装载器发现了版本1的test.Same接口并兴冲冲的装载,但是却想不到Same2Impl所 希望的是版本2 的test.Same,后面的事情可想而知了,异常被抛出。   我们很难责怪Java中暂时并没有提供区分版本的机制,如果使用了比较复杂的类装载器体系结构,在出现了某个包或者类的多个版本时,应特别注意。   掌握和灵活运用Java的类装载器的体系结构,对程序的系统设计,程序的实现,已经程序的调试,都有相当大的帮助。希望以上的内容能够对您有所帮助。   原文地址: 学习ej

23、b设计模式和看代码(最重要) 设计模式是练内功,其重要性可以这么说吧,如果你不会用设计模式的话,你将写出一堆使用了ejb的垃圾,又慢又是一堆bug,其结果不如不用ejb实现(ejb不等于j2ee) 无论学习什么语言,都应该看大量代码,你看的代码量不到一定数量,是学不好j2ee的 目前有很多开源的工程可以作为教材:   jive论坛   petstore sun公司   dune sun公司 等等,研读一个,并把它用到自己的工程中来。 J2ee其他学习 当你渐渐对j2ee了解到一定深度时,你要开始关注当前领域中的一些技术变化,J2ee是一块百家争鸣的领域,

24、大家都在这里提出自己的解决方案,例 如structs,hiberate,ofbiz等等,学习这些东西要你的项目和目标而定,预先补充一下未尝不可,但不用涉及太深,毕竟学习原理和理论是 最最重要的事。 目前常见j2eeAPI   JavaServer Pages(JSP)技术1.2   Java Servlet技术2.3   JDBC API 2.0   Java XML处理API(JAXP)1.1   Enterprise JavaBeans技术2.0   Java消息服务(JMS)1.0   Java命名目录接口(JNDI)1.2   Java事务API(JTA) 1.0   JavaMail API 1.2   JavaBeans激活架构(JAF)1.0   J2EE连接器体系结构(JCA)1.0   Java认证和授权服务(JAAS)1.0 学习上面的某些API要以你的项目而定,了解所有他们总之是有好处的 

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服