`
snoopy7713
  • 浏览: 1156753 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

插件平台的类加载机制

    博客分类:
  • OSGi
 
阅读更多

作为一个插件平台,除了要解决在运行时插件的交互问题外,还需要解决一个非常重要的问题 ——类加载。原因在于:(1)类加载机制可以绕过默认类型加载器按需自动加载每一个插件的所有类型;(2)插件具备独立性,即一个插件的运行不能对其它插件和插件内核平台产生影响,这使得类加载机制必须维护每一个插件的类型;(3)每一个插件可能会引用同一个Class的不同版本,这要求类加载机制必须能够加载多个版本的同一个类并为每一个插件维护其特定版本的类型。本文将讨论一下基于Java和.NET的插件平台的类加载机制。

 

在Java平台,每一个类型是由ClassLoader和类型全称唯一标识。ClassLoader具有父子关系的层次结构。来自于不同 ClassLoader的相同全名的类被视为不同类型。ClassLoader提供了简单、灵活且优雅的类型加载机制,在默认的ClassLoader 中,利用其进行类型加载时,它会先尝试使用父ClassLoader进行加载,如果在父ClassLoader没有加载成功,才考虑用子 ClassLoader中加载。如果请求子ClassLoader加载的类型,若在父ClassLoader中加载成功,则子ClassLoader不会再加载,会直接从父ClassLoader中获取。这意味着,一个在父ClassLoader中加载的类型可以和所有的子ClassLoader共享,不过,子ClassLoader间是不能够共享类型的(这种父ClassLoader向子ClassLoader的共享行为可以通过自定义 ClassLoader来改变)。考虑到Java的默认ClassLoader机制,在我看来理想状态下的插件平台的类加载机制的设计应该如下图(虽然我不是专业的Java开发人员,但是对其ClassLoader非常感兴趣,于是好好研究了一下,个人觉得该图的ClassLoader层次设计要比 JavaPluginFramework优雅)。这个类加载机制由3层ClassLoader组成,类加载管理器必须严格控制线程执行过程中的 ClassLoader,从而实现插件独立行、多版本类型支持、插件与平台无关性。(附:Flex的类型加载类似于Java的ClassLoader,只不过它被命名为AppDomain,估计是吸收了.NET和Java的优点。不过,在开发插件化的Flex平台时,如果采用的是分层的AppDomain 的话,很容易碰到TypeA转换成TypeA异常的问题,我把它称为Singleton Hell Issue,因为Flex底层类库使用了不少的单件类,如果一个AppDomain注册一个实例,另一个AppDomain获取并使用则出现异常,这类异常在Flex SDK 3.0中大量存在。因此,我们在使用Java的ClassLoader和Flex的AppDomain的时候,需要谨慎并精细。)

 

 

(鉴于本文有点抽象,于是举个例子说明一下 )假设在当前线程运行到Plugin B的代码,插件管理器在执行Plugin B的代码之前已经将其类加载器设置为PluginClassLoader了,因此,线程在执行代码的过程中,如果碰到新的类型,则将从 PluginClassLoader B中加载所需的类型;同理,当执行Plugin A的代码时,其加载器使用的是PluginClassLoader A。这为插件类型空间提供了独立性,从而使得在A和B插件可以使用同一个类型的不同版本。

 

在.NET平台中,每一个类型是由AppDomain + 程序集全名 + 类全名来唯一标识的。微软在程序集中直接声明了版本号。因此,CLR Loader允许在一个AppDomain存在多个版本的相同程序集,这意味着在同一AppDomain可能存在不同版本的类型。.NET的程序集相对于 Java的Package而言,它天生就对版本进行了标识,也就直接解决了插件平台类型加载的多版本问题。不过,遗憾的是,加载到一个AppDomain 的程序集是无法被卸载的,除非卸载整个AppDomain。为了实现插件的动态卸载,这就要求为每一个插件创建一个独立的AppDomain,但这又引入了Remoting Call,极大降低了性能。我在这里提到的类加载机制,为了性能和系统简单性考虑,忽略了插件的动态卸载,仅为一个插件平台使用一个AppDomain,并引入了一套新的类型加载机制,该类型加载机制能够按需加载程序集,其设计,部分借鉴了Java ClassLoader的思路,如下图。在此机制的TypeLoader由其加载的Assembly组成,也具备有一个层次结构,每一个插件的类型加载都使用自身的BundleTypeLoader进行加载。BundleTypeLoader会从CoreTypeLoader、 SharedLibTypeLoader和依赖的BundleTypeLoader加载所需的类型。

 

 

本文基于.NET的TypeLoader将基于Assembly.LoadFile实现多版本程序集的加载,因此,我们需要为每一个插件管理好其相应的程序集,在Bundle B执行过程中,它将使用BundleTypeLoader B来加载所需的类型,而这个Loader会根据需要将对应的程序集加载到当前应用域。从而实现,在插件A和B,其类型加载仅限于从插件本身依赖的程序集加载,虽然所有的程序集都在同一个应用域,但已经被分层管理起来了。(其实原理就只有一句话“确保在插件平台上线程执行过程中能够加载到正确的类型”,比如执行插件A的代码时,插件A依赖的类型必须在其类加载器存在。)

 

Creative Commons License 转自:道法自然 http://www.cnblogs.com/baihmpgy/archive/2009/11/12/1601753.html
分享到:
评论

相关推荐

    JVM类加载机制详细讲解

    总结,JVM 类加载机制是Java平台的核心特性之一,它确保了程序的稳定运行和动态扩展能力。理解类加载器的工作原理和双亲委派模型对于优化程序性能、解决类冲突以及构建复杂的模块化系统至关重要。在实际开发中,掌握...

    Android类加载机制、插件化、热修复

    总的来说,Android类加载机制、插件化和热修复是Android开发中的高级主题,它们涉及到Android系统的底层运作,对于优化应用程序性能、实现动态更新以及提高用户体验具有重要意义。深入理解和掌握这些知识,对于...

    类加载机制1

    Java 类加载机制是Java语言的核心特性之一,它允许程序在运行时动态地加载和执行类。这个机制在Java 1.0版本时引入,最初是为了支持Java Applet,即可以在Web浏览器中运行的小型Java应用程序。随着时间的发展,类...

    ClassLoader类加载机制和原理详解

    本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载机制遵循“双亲委派模型”(Delegation Model)。当一个类被加载时,它首先会尝试由当前...

    译 Java类加载机制(二)

    Java类加载机制是Java平台核心特性之一,它负责将类的.class文件加载到JVM(Java虚拟机)中,使得程序能够运行。本篇主要基于“译 Java类加载机制(一、二)”的博客内容,深入探讨Java的类加载过程、类加载器以及...

    Java类加载原理解析

    Java 类加载机制是Java技术体系中的重要组成部分,它...总之,Java类加载机制是Java平台动态性和安全性的重要保障。理解这一机制对于开发人员来说,不仅有助于解决运行时错误,还能更好地利用Java的灵活性和扩展性。

    Java动态类加载机制应用研究.zip

    Java动态类加载机制是Java平台一个非常重要的特性,它允许程序在运行时动态地加载类,增强了软件的灵活性和可扩展性。动态类加载对于理解和优化Java应用程序的性能、实现插件系统、以及处理复杂的模块化系统至关重要...

    Java类加载机制学习1

    Java 类加载机制是Java运行时环境中的核心组成部分,它负责将`.class`文件中的字节码转换为运行时的Class对象。在这个过程中,类加载器扮演着至关重要的角色。本篇文章将深入探讨Java的双亲模型类加载机制,以及如何...

    Java类加载机制 PDF 下载

    Java类加载机制是Java运行时环境中的核心组成部分,它负责将编译后的字节码(.class文件)加载到Java虚拟机(JVM)中,使得程序能够执行。这一过程涉及多个步骤,包括加载、验证、准备、解析和初始化。理解类加载...

    Android中的动态加载机制

    对于Android系统来说,动态加载机制尤其适合用于实现插件化,使得开发者能够像安装插件一样扩展应用程序的功能。 二、Android中的动态加载实现 1. ClassLoader重写:Android系统的类加载是通过ClassLoader来完成的...

    深入理解java类加载机制

    总之,深入理解Java类加载机制对于Java程序员来说非常重要,它有助于提升代码质量,优化程序性能,解决运行时问题,并为高级技术如动态代理、插件化开发等提供基础。通过学习和实践,开发者可以更好地利用Java的动态...

    JVM(三):类加载机制(类加载过程和类加载器)1

    Java虚拟机(JVM)的类加载机制是Java应用程序运行灵活性的关键。类加载涉及多个步骤,包括加载、验证、准备、解析、初始化、使用和卸载。这些阶段确保了类的正确加载、验证其安全性和有效运行。 1. **加载...

    从JDK源码级别剖析JVM类加载机制

    Java虚拟机(JVM)是Java程序运行的基础,它的类加载机制是理解Java应用程序如何启动和执行的关键部分。本文将深入JDK源码,详细解析JVM类加载机制的各个环节,帮助开发者更好地理解和优化自己的代码。 类加载机制...

    ClassLoader(类加载机制)1

    Java的类加载机制是其运行的核心部分,它涉及到如何将`.class`文件转换为内存中的类实例。在Java中,`ClassLoader`是负责这个过程的关键组件。本文将深入探讨ClassLoader的工作原理,Java类的结构,以及Java类的动态...

    安卓插件机制相关-插件化动态加载在宿主程序中调用插件的组件或类.zip

    这个压缩包"安卓插件机制相关-插件化动态加载在宿主程序中调用插件的组件或类.zip"显然提供了关于如何实现这种机制的源码和资料。 插件化的核心思想是将应用的各个功能模块解耦,使得它们可以在不修改或重新编译...

    01-VIP-类加载机制深度剖析(1)1

    《类加载机制深度剖析》 Java程序的运行离不开类加载机制,它是JVM的重要组成部分,负责将类的字节码加载到JVM中并进行解析和初始化。本篇将深入探讨类加载的过程、类加载器以及双亲委派机制。 一、类加载过程 1....

    Qt自定义插件设计与加载过程

    Qt 是一个跨平台的应用程序开发框架,提供了强大的图形用户界面(GUI)组件和插件机制。Qt 插件是 Qt 框架中的一种扩展机制,允许开发者创建自定义控件,并将其加载到 Qt Creator 中,以实现特定功能的扩展。 在 Qt...

    Java类加载及SPI机制.zip

    Java类加载机制是Java运行时环境的核心组成部分,它负责将.class文件从磁盘加载到内存中,转换为可执行的Java对象。理解类加载机制对于优化应用性能、深入理解JVM工作原理至关重要。SPI(Service Provider Interface...

    插件化动态加载apk

    4. **安全问题**:动态加载apk增加了恶意代码注入的风险,需要有严格的插件签名验证机制。 5. **接口通信**:主应用和插件之间需要通过接口进行通信,定义好服务调用和数据交换的协议。 总的来说,插件化动态加载...

Global site tag (gtag.js) - Google Analytics