扩展类加载器-------改变JAVA的父优先类加载顺序

转载 2011年01月24日 16:09:00

java的类加载机制默认情况下是采用委托模型:当加载某个类时JVM会首先尝试用当前类加载器的父类加载器加载该类,若父类加载器加载不到再由当前类加载器来加载,因此这种模型又叫做“父优先”模型。

    但是在实际项目中我们可能会要求先从当前类加载加载再从父类加载器加载,如项目中的某类的版本可能和container中的不一致的时候,若还从container加载就会报jar包冲突的异常,实际上jar包冲突的问题在实际开发过程中是经常会遇到的。如我们在开发Loong时就遇到了类似问题。

    解决方案是通过扩展自定义的ClassLoader,重写loadClass方法,先从当前类加载器加载再从父类加载器加载。

 

Java代码 复制代码
  1. public class MCFClassLoader extends URLClassLoader {   
  2.        public MCFClassLoader(URL[] urls) {   
  3.            super(urls);   
  4.        }   
  5.   
  6.        public MCFClassLoader(URL[] urls, ClassLoader parent) {   
  7.            super(urls, parent);   
  8.        }   
  9.   
  10.        public MCFClassLoader(URL[] urls, ClassLoader parent,   
  11.                URLStreamHandlerFactory factory) {   
  12.            super(urls, parent, factory);   
  13.        }   
  14.   
  15.        public Class<?> loadClass(String name) throws ClassNotFoundException {   
  16.            Class c = findLoadedClass(name);   
  17.            if (c == null) {   
  18.                try {   
  19.                    c = findClass(name);   
  20.                } catch (ClassNotFoundException e) {   
  21.                    return super.loadClass(name);   
  22.                }   
  23.            }   
  24.            return c;   
  25.        }   
  26.   
  27.    }  

    通过上面的ClassLoader就解决了我们遇到的问题。

    思考:通过扩展URLClassLoader可以实现好多有趣的功能,如支持多父、支持加载顺序配置等等。

    作为补充给出一个使用上面的ClassLoader的示例代码:

Java代码 复制代码
  1. public ClassLoader getDSClassLoader(String moudleName) {   
  2.         if (DSClassLoader == null) {   
  3.             try {   
  4.                 DSClassLoader = new MCFClassLoader(   
  5.                         new URL[] {   
  6.                                 new URL("......xxx.jar"),   
  7.                                new URL("......yyy.jar")},   
  8.                         ConnectorConfigurationParserServiceImpl.class  
  9.                                 .getClassLoader());   
  10.             } catch (MalformedURLException e) {   
  11.                 // TODO Auto-generated catch block   
  12.                 e.printStackTrace();   
  13.             }   
  14.         }   
  15.         return DSClassLoader;   
  16.     }  

 

    上面的例子说明当xxx.jar或yyy.jar中有需要加载的类时就从这些jar包里加载,即使所在的container里有同样的类,这样可在一定程度上避免jar包版本冲突的问题!

深入理解Java类加载器(1):Java类加载原理解析

1       基本信息 每个java开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载。Java的类加载...
  • zhoudaxia
  • zhoudaxia
  • 2014年07月06日 19:08
  • 42751

扩展类加载器的加载问题

我们都知道java的类载入器共有三级,分别是bootstrap (引导类)加载器、extension(扩展类)加载器和 system (系统类)加载器。这三个加载器是父子关系,其中 bootstrap...
  • dlf123321
  • dlf123321
  • 2014年10月24日 18:17
  • 1624

Java 自定义类加载器实现插件式开发

http://blog.csdn.net/top_code/article/details/43052731 http://blog.csdn.net/u011037869/article/...
  • u012506661
  • u012506661
  • 2017年11月19日 19:53
  • 159

java三种类加载器--jre/lib/ext扩展jar加载过程

首先来了解一下字节码和class文件的区别: 我们知道,新建一个java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java...
  • qq_27886997
  • qq_27886997
  • 2017年11月27日 18:54
  • 68

java学习之深入类加载器--ClassLoader

1.类加载器的原理 2.类加载器树状结构,双亲委托(代理)机制 3.自定义类加载器(文件,网络,加密) 4.线程上下文类加载器 5.服务器类加载原理和OSGI介绍 一、类加载器的作用 将class文...
  • haitaofeiyang
  • haitaofeiyang
  • 2015年03月15日 21:19
  • 1897

Java高新技术第一篇:类加载器详解

首先来了解一下字节码和class文件的区别: 我们知道,新建一个java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java工程...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年01月01日 14:45
  • 24720

Java ----类加载器(自己写)

每一个技术,最好掌握以下底层的原理,这样才能得心应手
  • yangxin_blog
  • yangxin_blog
  • 2015年09月04日 22:34
  • 904

Java类加载器介绍

本文介绍类加载器概念,类加载器的分类,类加载器加载类的机制,最后实现一个自定义类加载器。...
  • yuxxz
  • yuxxz
  • 2016年05月09日 23:27
  • 3920

Java类加载器与反射

一个命令对应一个进程 当我们启动一个Java程序,即启动一个main方法时,都将启动一个Java虚拟机进程,不管这个进程有多么复杂。而不同的JVM进程之间是不会相互影响的。这也就是为什么说,Java程...
  • rusbme
  • rusbme
  • 2016年05月03日 15:16
  • 1496

JAVA类加载机制以及如何自定义类加载器

原文链接:http://xtuhcy.iteye.com/blog/2305410 从双亲委派说起 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 /lib下面的...
  • chen88358323
  • chen88358323
  • 2016年06月21日 16:13
  • 1957
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:扩展类加载器-------改变JAVA的父优先类加载顺序
举报原因:
原因补充:

(最多只允许输入30个字)