首页 > 编程知识 正文

怎么破坏双亲委派模型,什么情况违反双亲委派机制

时间:2023-05-06 05:42:19 阅读:15658 作者:1441

3358 www.Sina.com/bootstrap class loader :根类加载器。 加载java核心类。 由JVM自己实现,而不是由java.lang.ClassLoader的子类实现。 扩展类加载器:扩展类加载器。 扩展类加载器的加载路径是JDK目录中的jre/lib/ext,扩展类的getParent )方法返回null。 事实上,扩展类加载器的父类加载器是根加载器,而不仅仅是根加载器是由Java实现的。 启动JVM时加载由java命令的-CLASSPATH选项、java.class.path系统属性或classpath环境变量指定的jar包和类路径的System ClassLoader: 程序可以从getSystemClassLoader ()获取系统类加载器。Java类加载器

首先,搜索当前ClassLoader是否加载过这样的类,如果有,则返回; 如果不存在,则询问父ClassLoader是否加载了类,如果加载了,则直接返回Parent加载的类。 如果整个类加载器体系中没有加载ClassLoader,则当前ClassLoader加载(调用findClass )。双亲委派模型的工作过程作用:保证JDK核心类的优先加载;

双亲委派模型的作用自定义类加载器,重写loadClass方法; 使用线程上下文类加载器;如何打破双亲委派模型?1 .首次破坏

由于父代代理模型是在JDK1.2之后部署的,类加载器和抽象类java.lang.ClassLoader在JDK1.0时代就已经存在,因此Java设计器不会对已经存在的用户定义类加载器的实现代码妥协到目前为止,用户继承java.lang.ClassLoader的唯一目的是重写loadClass ()方法。 这是因为虚拟机在加载类时调用加载器的专用方法loadClassInternal ) )。 此方法的唯一逻辑是调用自己的loadClass ) ) )。

2 .第二次破坏

父母委托模式的第二次“破坏”源于该模式自身的缺陷。 父母委托很好地解决了各级加载器基类中的相同问题(越基类由越上层加载器加载)。 基类之所以称为“基础”,是因为它们总是由用户代码调用的API,但世事往往没有绝对的完美。

如果基类又调用用户的代码,该怎么办?

一个典型的例子是JNDI服务。 JNDI现在是Java的标准服务。

那个代码由启动类加载器加载。 (JDK1.3时放入的rt.jar )。 但JNDI的目的是集中管理和搜索资源。 必须调用由独立供应商实现并部署在APP应用程序的ClassPath下的JNDI接口提供程序的代码,但启动类装载器无法“识别”这些代码。

为了解决这个问题,Java设计团队不得不引入一种不太优雅的设计:“线程上下文类加载器”(Thread Context ClassLoader )。 可以在java.lang.Thread类的setContextClassLoader ()方法中设置此类加载器。 如果在创建线程时尚未设置,它将从父线程继承。 如果未在APP应用程序的全局范围内设置,则缺省为APP应用程序类加载器。

有了线程上下文加载器,JNDI服务就可以使用它加载所需的SPI代码。 这意味着父类加载器请求子类加载器加载类的行为。 这实际上意味着父代委托模型层次结构并反向使用类加载器,这违背了父代委托模型的一般原则,但这是没有办法的。 与Java SPI相关的所有加载行为基本上都采用这种方式,如JNDI、JDBC、JCE、JAXB和JBI。

3.3第三次破坏

父母委托模型的第三次“破坏”是用户对程序动态性的追求,这里所说的“动态性”是现在非常“受欢迎”的名词。 代码的热插拔、模块的热部署等,简单来说就是机器不需要重新启动,只要部署就可以使用。

实现OSGi模块化热部署的关键是实现其定制的类装载器机制。 每个程序模块(Bundle )都有自己的类加载器,如果需要更换Bundle,可以为每个类加载器更换Bundle以热交换代码。 在OSGimagicquadrant中,类加载器已发展为更复杂的网格结构,而不是父代委托模型的树结构。 当OSGi收到类加载请求时,它按以下顺序搜索类:

1 )将以java.*开头的类委托给父类加载器进行加载。

2 )否则,将委托列表中的类委托给父类加载器进行加载。

3 )否则,将Import列表中的类委托给名为Export的类的Bundle的类加载器进行加载。

4 )否则,找到当前Bundle的ClassPath,然后使用自己的类加载器加载。

5 )否则,检查类是否在自己的Fragment Bundle中,如果有,将加载委托给Fragment Bundle的类加载器。

6 )否则,在动态导入列表中找到Bundle,然后将加载委托给相应的Bundle类加载器。

7 )否则,类加载器将失败。

作者:我是一动不动的friend

链接: https://www.Jian Shu.com/p/166 c 5360 a 40 b

资料来源:简本

简本版权归作者所有,任何形式的转载请联系作者取得许可并注明出处。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。