Thread.getContextClassLoader() 详解_第1页
Thread.getContextClassLoader() 详解_第2页
Thread.getContextClassLoader() 详解_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在创建需要动态加载许多类和资源的帧代码时经常出现此问题。 通常,如果需要动态加载资源,则至少三个类loader可以选择:被称为系统类装载器或应用程序类装载器。当前类装载器当前线程类装载器上面的问题是最后一种装载机。 哪种装载器是正确的选择?第一个选择可以容易地消除:系统类装载器。 此类加载器可以在-classpath中处理类加载任务,并使用classloader.getsystemclassloader ()方法调用. class loader下的所有getSystemXXX ()静态方法都可以在此在你的代码中,应该尽可能少地调用这个方法把其他类装载器作为代理。 否则,你的代码只能在简单的命令

2、行应用程序中工作。 此时,系统类装载器(system classloader )是JVM最后创建的类装载器。 但是,如果将代码移动到EJB、Web应用程序或Java Web Start应用程序中,一定会出现问题。因此,让我们来看看第二个选项:在当前上下文环境中的类装载器。 根据定义,当前类装载器是你当前方法所属的类的装载器。 在运行时类之间动态协作,并调用Class.forName、() Class.getResource ()等类似方法时,此类装载器隐式使用. itisalsousedbysynacticconstructlikex .线程上下文类型加载程序是在Java 2平台上引入的。 每

3、个线程都有一个类加载程序(如果此线程不是用本地代码创建的)。 此类加载器是在Thread.setContextClassLoaser ()方法中设置的。 如果线程生成后不调用,则该线程从其父线程继承相应的上下文类装载器。 所有线程都使用“系统类加载器”(system classloader )作为自己的线程上下文加载器,除非在整个应用程序中进行了特殊设置。 Web应用程序和J2EE应用服务器自从使用成熟的类加载器机制来实现JNDI、线程池和组件热部署等功能以来,很少在整个应用程序中都没有设置线程类加载器。为什么线程上下文类的装载器存在于这样重要的位置?这个概念在J2SE中的引入还没有受到关注。

4、 很多开发者对这个概念感到困惑是因为Sun公司在这方面缺乏适当的指导和文件实际上,上下文类装载器提供了类装载机构的后门,但也引入到J2SE中。一般来说,JVM的所有类装载器都被组织为继承层次结构,每个类装载器(启动JVM的原始类装载器除外) 每当提示加载类时,类加载器首先请求其父类加载器,只有在父类加载器不能加载时才进行类加载.这种加载排序可能无法正常工作,通常情况下,必须动态加载应用程序开发人员提供的资源。 以JNDI为例,的内容(从J2SE1.3开始)通过rt.jar的引导类实现,但是这些JNDI核心类由独立的供应商实现,并动态部署在应用程序的类路径下的JNDI提供器在这种情况下,父类加载

5、器(在本示例中为引导类加载器)必须加载其子类加载器之一(在本示例中为系统类加载器)可见的类.在这种情况下,常规类加载器代理机构需要此请求通过使JNDI核心类使用当前线程上下文的类加载器,在基本类加载器代理机制的相反方向上建立了有效路由。另外,上一段中,也许用: XML回忆了几件其他事情,并在分析Java API(JAXP )。 如果JAXP只是J2SE的扩展,则JAXP必然使用当前类装载器引导解析器的实现。 如果将JAXP添加到J2SE1.4核心类库中,该类加载器也将更改为当前线程加载器,这与JNDI的情况完全类似(迷惑了很多程序员)。 我理解为什么来自Sun的指导不足在以上介绍之后,并非所有

6、环境都有两个选项:重要问题: (当前类装载器和当前线程类装载器)。 也有人认为现在的线程类装载器应该成为新的标准战略。 但是,如果多个线程以这种方式以共享数据进行交换,则会出现非常复杂的类装载的画面,除非它们都使用相同上下文的类装载器.此外,在一些剩馀的解决方案中,将其委托给当前的类装载器的方法已经是标准的.例如。 对Class.forName(String )的直接调用(也是建议尽量避免这种方法的调用的理由)具有即使努力仅调用与上下文相关的类加载器也不受控制的代码。更严重的问题是,一些应用服务器将环境上下文和当前类装载器设置为不同的类装载器实例,这些类装载器具有相同的类路径,但没有委托机制的父子关系。 想想你为什么那么害怕。 类加载器定义和加载的类实例具有JVM内部的ID号。 当当前类加载器加载类x的实例时,该实例调用JNDI搜索类y的实例,上下文类加载器也可以定义加载类y的实例.该类y的定义可以由当前类加载器看到这个混乱的状况Java也有时间。 对于需要动态加载资源的J2SE API,考虑类加法策略。 例如:JNDI使用线程上下文类的加载器Class.getResource ()和Class.forName ()使用当前的类加载器JAXP(J2SE 1.4或更高版本)使用线程上下文类的加载器java.util.ResourceBundle使用调用的当前类加载器ur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论