`
chillwarmoon
  • 浏览: 155020 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java的动态加载机制分析和应用

    博客分类:
  • work
阅读更多
转载请注明出处http://chillwarmoon.iteye.com
要弄清楚动态加载(热部署),首先要明白以下几点:
(1)一个classLoader实例只能对一个类加载一次。
(2)通过defineClass方法,可以动态加载类文件的byte数组到classloader实例中
(3)ClassLoader的loadClass方法加载类的顺序是:先用bootstrap classLoader加载类,如果加载不到,则用extClassLoader加载类,最后用system classLoader加载类
(4)假设某个自定义的CustomClassLoader用defineClass加载类,并且CustomClassLoader并没有覆盖loadClass方法。CustomClassLoader加载一个实现了接口IA的类A,那么defineClass会调用父类的loadClass,加载接口IA到system ClassLoader中。然而A被加载到了CustomClassLoader的实例中。

基于以上前提,若想达到对类A的热部署,不需要覆盖loadClass方法,让system ClassLoader加载接口,所以在由system classLoader加载的类中(也就是面向开发人员的代码中)可以通过类型转换IA a=(IA)clazz.newInstance(); 来访问动态加载的A的实例。但是因为每个classLoader实例只能对类加载一次,所以每次动态加载的时候,都需要创建一个classLoader实例来加载实现。
在实际应用中还要考虑动态加载点,也就是说什么时候对那些需要热部署的类进行动态加载。在网络应用中,如果要对某个长链接进行自定义处理,那么可以在链接建立的时候动态加载类。对于短链接的话,可以通过JMX手动动态更新类。也可以通过某个定时器来动态加载。
用动态加载的观点来看远程过程调用,就是说本地保存远程的接口,该接口是由本地的system classloader加载进来的,实现类通过byte流传过来,然后用特定的classLoader实例来加载该实现类。因此实现了远程过程调用。
分享到:
评论
5 楼 chillwarmoon 2009-05-30  
java.lang.Object 写道
抛出异常的爱 写道
classloader没有研究过
不过有没有可能把某个server端的class文件
传到客户端
并运行某个方法
(属性也有存在的必要)
像动态变化接口的实现一样.

这个不太可能,因为可能这个类又引用了很多客户端没有的类,并且这个类还有本地方法。


如果客户端引用的类在客户端已经被加载或者存在这些类,那么就可以。而且加载所依赖类的时候,未初始化时,初始化时,运行时都有可能加载。所以如果被依赖的类在某个不可见的方法内,那么应该也是可以的。

但是有一点是,服务器端传过来的class bytes,如果对应的类是一些jdk里边的类,如java.lang.String,客户端加载时需要小心,应该是首先用本地的class loader(例如bootstrap classloader)加载。因为如果采用自定义的加载,可能会产生一些安全问题。例如服务器端有些破坏性的实现。如果被委派到bootstrap classloader加载,bootstrap classloader会检查已加载的类,发现如果加载了,就不用加载String了。
4 楼 chillwarmoon 2009-05-30  
bachmozart 写道
可能是我理解的问题

远程调用不需要客户端自定义classloader,比如 Client A 存放一个类的存根,Server B存放实现

那么数据流动是这样的

A  ------(请求调用某个实现类,封装好的参数类名信息等)------>  B

B  -------(实现类被调用后返回的结果)-----------------> A

需要自定义classloader的只是 Server B服务器,启动时加载一次所有实现类的jar



感觉不是B将结果返回给A,而是B将class bytes返回给A,然后由A的classLoader来加在class bytes所对应的类。这个class loader可以自定义,也可以是system classloader,就看需求是什么样子的。
3 楼 java.lang.Object 2009-05-28  
抛出异常的爱 写道
classloader没有研究过
不过有没有可能把某个server端的class文件
传到客户端
并运行某个方法
(属性也有存在的必要)
像动态变化接口的实现一样.

这个不太可能,因为可能这个类又引用了很多客户端没有的类,并且这个类还有本地方法。
2 楼 抛出异常的爱 2009-05-27  
classloader没有研究过
不过有没有可能把某个server端的class文件
传到客户端
并运行某个方法
(属性也有存在的必要)
像动态变化接口的实现一样.
1 楼 bachmozart 2009-05-27  
可能是我理解的问题

远程调用不需要客户端自定义classloader,比如 Client A 存放一个类的存根,Server B存放实现

那么数据流动是这样的

A  ------(请求调用某个实现类,封装好的参数类名信息等)------>  B

B  -------(实现类被调用后返回的结果)-----------------> A

需要自定义classloader的只是 Server B服务器,启动时加载一次所有实现类的jar

相关推荐

    Java动态类加载机制分析及其应用.pdf

    Java 动态类加载机制分析及其应用 Java 动态类加载机制是 Java 虚拟机(JVM)的一种机制,允许在 Java 应用程序运行期间动态加载类文件,而不影响其他功能模块的正常运行。这种机制可以提高 Java 应用程序的灵活性...

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

    通过对 Java 类加载器的体系结构、动态类加载机制原理、实现过程和实现方法的分析,可以实现动态类加载机制,并且可以应用于网络教学环境中。 Java 动态类加载机制的应用前景非常广阔,具有非常重要的意义。 本文...

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

    文章《Java动态类加载机制应用研究.pdf》通过分析Java类加载器的层次体系结构和动态加载机制的原理,探讨了动态类加载技术在实际中的应用,并以高校网站管理平台的文件发布模块为例进行了具体说明。 首先,我们来看...

    JAVA 类加载机制分析

    JAVA 类加载机制是Java平台核心特性之一,它关乎到程序的运行时环境和代码的动态加载。理解这一机制有助于开发者解决与对象创建、配置问题、应用程序发布等相关的问题。以下是关于JAVA 类加载机制的详细分析: 首先...

    java类加载机制

    Java 类加载机制是Java运行时环境的一个核心组成部分,它负责将编译后的Java字节码加载到JVM中,并确保Java应用程序能够正确地运行。类加载机制不仅涉及到类的加载、验证、准备、解析和初始化等步骤,还包括类加载...

    Java动态代理机制分析

    Java 动态代理机制是Java反射机制的一部分,它允许开发者在运行时动态创建代理类和对象,以便在方法调用时插入自定义的行为。这种机制主要用于实现AOP(面向切面编程)和拦截器模式,提供了对方法调用的额外控制和...

    java动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    Android中的动态加载机制(折腾版) 源码

    本篇主要探讨Android动态加载机制的实现原理,结合源码分析,帮助开发者更好地理解和运用这一技术。 一、动态加载的基本概念 动态加载是指在程序运行过程中,根据需要动态地加载类或库,而不是在程序启动时一次性...

    译 Java类加载机制(二)

    在提供的文档"java类加载机制.doc"中,应该会详细阐述这些概念,并可能包含实例分析和源码解读,帮助读者更好地理解和应用Java类加载机制。对于希望优化系统性能或进行底层优化的开发者来说,这是一个不可多得的学习...

    java注解_反射_字节码_类加载机制.zip

    Java注解、反射、字节码和类加载机制是Java编程中的核心概念,它们在实际开发中扮演着重要角色。让我们深入探讨这些知识点。 **Java注解(Annotation)**: Java注解是一种元数据,它提供了在编译时或运行时处理代码的...

    Java类动态加载机制在铁路互联网售票中的设计与实现.pdf

    Java类加载机制遵循双亲委派模型,主要包括启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用类加载器(Application ClassLoader)三个层次。这种设计可以有效避免不同类加载器...

    Java类加载机制学习1

    而`GreetingClassLoader.java`可能通过ASM(Java字节码操控和分析框架)技术动态生成类代码,提供了更灵活的代码增强功能。在`findClass()`方法找到类后,可以在`defineClass()`之前对字节码进行操作,如添加日志、...

    java动态加载类

    Java的反射机制提供了一套完整的API,用于在运行时分析类的结构和行为。通过反射,不仅可以动态地获取类的信息,还可以动态地创建和操作对象,包括调用静态方法。这使得动态加载类的应用场景更加广泛。 具体到上文...

    java类加载原理分析

    Java 类加载原理是Java运行时环境中的核心机制之一,它涉及到类的生命周期、类加载器的层次结构以及类的查找和加载过程。了解这一机制对于深入理解Java平台的工作原理至关重要,尤其是在开发自定义类加载器或者处理...

    Java的安全机制研究与分析

    Java的安全机制是其独特优势之一,它通过一系列的内置安全特性确保了应用程序的稳定性和安全性。本文基于给定的文件信息,深入探讨Java安全机制的关键组成部分及其运作原理。 ### Java安全机制的体系结构 Java安全...

    Java动态加载类小实验.pdf

    ### Java动态加载类知识点总结 Java动态加载类的概念,是指在运行时通过反射机制加载类的...通过以上知识点的梳理和示例分析,我们可以了解到Java动态加载类的基本原理和应用场景,以及如何在实际编程中应用这一技术。

    JAVA类加载器分析--热部署的缺陷(有代码示例,及分析)

    总之,“JAVA类加载器分析--热部署的缺陷”这篇博文深入探讨了Java中的类加载机制,特别是热部署过程中可能出现的问题,以及如何通过理解这些机制来优化和解决问题。了解这些知识对于开发和维护大型Java应用至关重要...

    Java 动态代理Proxy应用和底层源码分析.pdf

    ### Java 动态代理Proxy应用和底层源码分析 #### 一、Java动态代理简介 Java动态代理是一种在运行时动态生成代理类的技术,通过该技术可以为一个或多个接口生成一个实现类,该实现类可以拦截接口方法的调用,并...

    java类加载器-tomcat中的类加载器

    总之,理解Java类加载器和Tomcat的类加载机制对于开发和调试基于Tomcat的应用程序至关重要。它涉及到类的查找、加载、初始化等过程,以及如何通过调整类加载器配置来优化应用性能和安全性。深入研究这些概念,能够让...

    JVM类加载机制详细讲解

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

Global site tag (gtag.js) - Google Analytics