`
aidxn527
  • 浏览: 43397 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类

Java编程极限考验:ClassLoader类装载策略

    博客分类:
  • Java
阅读更多

个人认为,Java编程中极限考验是Classloader机制的掌握和灵活运用,特别是在复杂的系统,如存在动态类装载,Reflect,EJB,AOP等环境。

CLass.forName()
和Thread.currentThread().getContextClassLoader())
是否一样?

在很多文章中,都认为两者是一致的,如Java研究组织中一篇文章,被我从google搜索到的:
http://www.javaresearch.org/article/showarticle.jsp?column=31&thread=10178
文中说"这个方法可以用Class.forName()代替",在一般简单情况是可以替代,但实际上有时候是不能替代的。

Classloader存在下面问题:
在一个JVM中可能存在多个ClassLoader,每个ClassLoader拥有自己的NameSpace。一个ClassLoader只能拥有一个class对象类型的实例,但是不同的ClassLoader可能拥有相同的class对象实例,这时可能产生致命的问题。如ClassLoaderA,装载了类A的类型实例A1,而ClassLoaderB,也装载了类A的对象实例A2。逻辑上讲A1=A2,但是由于A1和A2来自于不同的ClassLoader,它们实际上是完全不同的,如果A中定义了一个静态变量c,则c在不同的ClassLoader中的值是不同的。

因此,研究JBoss的ClassLoader策略,对于更好地实现EJB组件拼装是用好处的,因为,一个项目中可能要用其他项目的EJB组件,如何实现运行时EJB组件共享,如何实现EJB组件打包是很重要的。


为了说明ClassLoader对于复杂架构是至重关键,列举开源Portal产品Exo中ServivesManager类内容。

该类是Exo利用PicoCOntainer实现功能性Service JavaBeans初始化,在将那些Service性质的JavaBeans加载到pico中时,需要使用到Classloader,
Exo专门设立一个ServiceContext类:

public class ServiceContext { 

      private ClassLoader cl; //包含Classloader信息 private Services services; 

      public ServiceContext(ClassLoader cl, Services services) { 
          this.cl = cl;
          this.services = services;
     } 
      public ClassLoader getCl() {
          return cl;
     }
     public Services getServices() {
         return services;
    }
}

 在ServicesManager中,有:
private ClassLoader updatedClassLoader;

它的初始值是:
Thread.currentThread().getContextClassLoader();

如果,这里写Class.forName 那么简单,那么你头疼去吧。

但是这样不够:
在addService方法中,根据加入的不同ServiceContext实现类装载

 

public void addService(ServiceContext context) {
     Services servicesToAdd = context.getServices();
     String name = servicesToAdd.getName();
     URLClassLoader cl = null;
     if(context.getCl() instanceof URLClassLoader) {
             cl = (URLClassLoader) context.getCl();
     } else {
             cl = URLClassLoader.newInstance(new URL[]{}, context.getCl());
     }
     updatedClassLoader = new URLClassLoader(cl.getURLs(), updatedClassLoader); 
     synchronized (servicesContext) {servicesContext.put(name, context);
     reloadContainer();}
}

 其实向Picocontainer中加入一个服务很简单,上述方法的主要代码是处理Classloader,考虑到Classloader有嵌套关系,上述代码小心使用这个Service服务的父Classloader,使用父Classloader装载服务Service。

分享到:
评论

相关推荐

    Java Classloading Mechanism : ClassLoader & ASM & 动态字节码增强

    Java 类加载机制是Java运行时环境中的核心组成部分,它负责将类的字节码加载到JVM(Java虚拟机)中并实现类的实例化。深入理解这一机制有助于开发者优化程序性能、实现自定义加载逻辑以及进行动态字节码增强。在本篇...

    Java SE: ClassLoader in depth

    所提供的内容实际上是一份公司入职报到的指南,与Java编程或者ClassLoader的技术细节无直接联系。然而,我可以根据标题和描述中要求的知识点,给出关于Java ClassLoader的一些深入知识点。 Java ClassLoader是Java...

    Java虚拟机类装载:原理、实现与应用.doc

    - **ClassLoader**:Java的类装载由ClassLoader及其子类实现。ClassLoader是一个抽象类,位于`java.lang`包中,主要职责是在运行时加载类文件。 - **关键方法**: - `loadClass(String name, boolean resolve)`:...

    Java虚拟机类装载:原理、实现与应用

    Java虚拟机类装载机制是Java运行环境的核心技术之一,它允许程序在运行时动态加载和使用类,极大地增强了软件的灵活性和可扩展性。本文主要探讨了类装载的原理、实现方式及其在实际应用中的作用。 首先,类装载的...

    661.659.JAVA基础教程_动态代理与Java8新特性-复习:ClassLoader(661).rar

    在本教程中,我们将深入探讨Java编程语言中的两个核心概念:动态代理和Java 8的新特性,特别是关于ClassLoader的部分。动态代理是Java中一个强大的工具,它允许在运行时创建对象,这些对象可以作为其他对象的代理,...

    Java虚拟机类装载的原理及实现

    所有JVM都内置了一个特殊的类装载器——根装载器(Bootstrap ClassLoader),它负责装载Java核心类库。当需要装载非设计时已知的类时,则需要使用用户自定义的类装载器。 #### 实例演示 以下是一个简单的示例,...

    java应用程序类加载器,ClassLoader for java Application

    Java应用程序类加载器是Java平台的核心组成部分之一,它负责加载应用程序中的类到JVM(Java虚拟机)中,使得程序能够执行。理解类加载器的工作原理对于深入学习Java编程至关重要。在Java中,类加载器按照层次结构...

    Java ClassLoader定制实例

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...

    Java深度历险(2)--深入类装载器

    3. **App ClassLoader**(应用程序类装载器):这是默认的类装载器,负责加载应用程序类路径(ClassPath)所指定的类。 此外,还可以自定义类装载器以满足特定需求,比如热部署(Hot Deployment)、模块化加载等。 ...

    ClassLoader类加载器

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。了解和掌握ClassLoader的工作原理以及如何自定义ClassLoader对于深入理解Java应用程序的运行机制非常有帮助。以下是对...

    Java类加载器(ClassLoader)1

    Java类加载器分为三种主要类型:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader,也称为系统类加载器)。它们共同工作,确保了Java...

    java ClassLoader机制及其在OSGi中的应用

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    破解java加密的ClassLoader.java,在classloader植入破解代码

    破解java加密的ClassLoader.java,在classloader植入破解代码

    Java的类装载器和命名空间

    在Java编程语言中,类装载器(ClassLoader)和命名空间是理解Java运行时环境的重要概念。它们共同确保了程序的正确性和安全性。类装载器负责将类文件加载到Java虚拟机(JVM)中,而命名空间则帮助组织和管理这些类,...

    Java虚拟机类装载.doc

    Java虚拟机类装载 Java虚拟机(JVM)的类装载是指将包含在类文件中的字节码装载到JVM中...了解了JVM中的类装载机制和ClassLoader的工作原理,可以更好地理解Java虚拟机的工作机制,并更好地使用Java语言开发应用程序。

    测试普通Java程序ClassLoader等级关系的Demo程序

    总之,这个名为“测试普通Java程序ClassLoader等级关系的Demo程序”旨在帮助开发者掌握Java中类加载器的工作原理和它们之间的层次关系,这对于理解Java应用程序的运行机制和进行问题排查具有非常实际的意义。...

Global site tag (gtag.js) - Google Analytics