小引子

最近做了一个根据同一模块的不同jar版本做同时测试的工具,感觉挺有意思,特此记录。

类加载器(ClassLoader)是啥?

把类加载阶段中的“通过一个类的全限定名(博主注:绝对路径)来获取描述此类的二进制字节流”这个动作放在Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块成为”类加载器“摘自周志明的《深入理解Java虚拟机》

ClassLoader的用途

  • 功能测试

    每个加载器,有自己的独立的类名称空间。比较两个类是否”相等“的前提是它们是由同一个类加载加载才有意义,即ClassLoader如果不同,两个类必定不等。这样使得在一个JVM中加载同一个模块的不同版本的jar成为现实,基于反射功能,我们同样可以很轻松实现不同版本的模块测试。本文后面会提供简单demo的实现。
  • 代码加密

    没有做过,想必是对class文件进行混淆、压缩、native等等手段后的解密过程,这类需求还没遇过。
  • OSGi

    是动态模型形同,在eclipse中插件的实现就是基于OSGi思想,而eclipse主要的应用就是插件,所以可以理解为eclipse插件是OSGi的应用典范。做的不多,仅限于了解。
  • 热部署

    不停止服务,动态替换目标文件。ClassLoader动态加载jar包,如果做一个工程化的东西可能会费些周章,但是原理并不复杂。
  • ...

总之,ClassLoader很重要,Java世界需要它。

功能测试小样

本人在本地生成了test1.jar和test2.jar两个jar包。这两个jar都有类com.array7.jvm.classloader.Target,此Demo要实现的是同时将这两个jar包的同名类加载到JVM并且各自执行。

** test1.jar Target.java **

package com.array7.jvm.classloader;

public class Target {
public static void main(String[] args) {
System.out.print("test1");
}
}

** test2.jar Target.java **

package com.array7.jvm.classloader;

public class Target {
public static void main(String[] args) {
System.out.print("test2");
}
}

** TestDriver**

public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, IllegalArgumentException, SecurityException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
ClassLoader loader1 = new URLClassLoader(new URL[]{new URL("file:/home/liushijie/workspace/test/out/artifacts/test1/test1.jar")}, TestDriver.class.getClassLoader());
ClassLoader loader2 = new URLClassLoader(new URL[]{new URL("file:/home/liushijie/workspace/test/out/artifacts/test2/test2.jar")}, TestDriver.class.getClassLoader()); String className = "com.array7.jvm.classloader.Target";
// loader1
System.out.print("test1.jar \t");
Class clazz1 = Class.forName(className, true, loader1);
clazz1.getMethod("main", String[].class).invoke(null, (Object) null); System.out.println(); // loader2
System.out.print("test2.jar \t");
Class clazz2 = Class.forName(className, true, loader2);
clazz2.getMethod("main", String[].class).invoke(null, (Object) null); System.out.println(); System.out.println("实例化后是否相等:" + clazz1.equals(clazz2)); }

输出

test1.jar 	test1
test2.jar test2
实例化后是否相等:false

其他未提知识点

  • ClassLoader的层级关系
  • 双亲委托与打破
  • 自定义ClassLoader

其他参考资料

类加载器ClassLoader之jar包隔离的更多相关文章

  1. java类加载器——ClassLoader

    Java的设计初衷是主要面向嵌入式领域,对于自定义的一些类,考虑使用依需求加载原则,即在程序使用到时才加载类,节省内存消耗,这时即可通过类加载器来动态加载. 如果你平时只是做web开发,那应该很少会跟 ...

  2. 深入理解Java类加载器(ClassLoader) (转)

    转自: http://blog.csdn.net/javazejian/article/details/73413292 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Ja ...

  3. Java类加载器(ClassLoader)

    类加载的机制的层次结构 每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Jav ...

  4. jvm之java类加载机制和类加载器(ClassLoader),方法区结构,堆中实例对象结构的详解

    一.类加载或类初始化:当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.连接.初始化3个步骤来对该类进行初始化.如果没有意外,JVM将会连续完成3个步骤. 二.类加载时机:  1 ...

  5. Java 类加载器(ClassLoader)

    类加载器 ClassLoader 什么是类加载器? 通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现, 以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代 ...

  6. 类加载器ClassLoader的理解

    最近在做一个热加载Class的小组件,这个组件需要对类加载器ClassLoader有所了解,我就顺便借这个机会把学到的一点皮毛与大家分享一下. 从Class文件开始 ClassLoader,顾名思义就 ...

  7. 类加载器ClassLoader

    上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限定名来获取描述此类的二进制字节流,也即是 ...

  8. Java虚拟机学习(5):类加载器(ClassLoader

    类加载器 类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 ...

  9. 深入理解Java类加载器(ClassLoader)

    深入理解Java类加载器(ClassLoader) Java学习记录--委派模型与类加载器 关于Java类加载双亲委派机制的思考(附一道面试题) 真正理解线程上下文类加载器(多案例分析) [jvm解析 ...

随机推荐

  1. Mysql学习笔记(五)数据查询之测试sql部分。

    正文之前,介绍mysql一些很有趣的命令. 快速的创建表,并填充表数据. create table test like  已经有的表名: inset into test select * from f ...

  2. 有return的情况下try catch finally的执行顺序

    结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  3. 利用WSCF进行契约先行的Web Services开发

    http://www.cnblogs.com/goody9807/archive/2007/06/05/772107.html 什么是契约先行(Contract-First)? 如果说一个新的软件开发 ...

  4. HTTP常见错误编号

    HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证 ...

  5. MyEclipse快捷键大全(绝对全)

    存盘 Ctrl+s(肯定知道) 注释代码 Ctrl+/ 取消注释 Ctrl+\(Eclipse3已经都合并到Ctrl+/了) 代码辅助 Alt+/ 快速修复 Ctrl+1 代码格式化 Ctrl+Shi ...

  6. 安装scikit-learn过程记录

    环境:Windows 10 X64企业版. 安装python2.7: 官网下载python-2.7.12.amd64.msi安装文件,过程不赘述.安装完成后在PATH环境变量中加入%PYTHON_HO ...

  7. 兼容ie6及一下版本的自适应

    <meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1" /> <meta ...

  8. Java递归算法——阶乘

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...

  9. 其他系统与ecshop的会员整合

    步骤一:整合两个的会员数据 用软件Navicat 的 "导入向导"功能,导入你的原数据类型(sql,mdb,db)我的是mdb类型.下一步选择你原有的会员字段“user”.再进行下 ...

  10. osharp3 整合 dbcontextscope 文章2 将dbcontext的创建收回到ioc管理

    osharp3 整合 dbcontextscope 后,,dbcontextscope 对dbcontext管理的很好,做到,用到时创建,不用时销毁,下面看一个 trace aspx.page: En ...