类加载器ClassLoader之jar包隔离
小引子
最近做了一个根据同一模块的不同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包隔离的更多相关文章
- java类加载器——ClassLoader
Java的设计初衷是主要面向嵌入式领域,对于自定义的一些类,考虑使用依需求加载原则,即在程序使用到时才加载类,节省内存消耗,这时即可通过类加载器来动态加载. 如果你平时只是做web开发,那应该很少会跟 ...
- 深入理解Java类加载器(ClassLoader) (转)
转自: http://blog.csdn.net/javazejian/article/details/73413292 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Ja ...
- Java类加载器(ClassLoader)
类加载的机制的层次结构 每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Jav ...
- jvm之java类加载机制和类加载器(ClassLoader),方法区结构,堆中实例对象结构的详解
一.类加载或类初始化:当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.连接.初始化3个步骤来对该类进行初始化.如果没有意外,JVM将会连续完成3个步骤. 二.类加载时机: 1 ...
- Java 类加载器(ClassLoader)
类加载器 ClassLoader 什么是类加载器? 通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现, 以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代 ...
- 类加载器ClassLoader的理解
最近在做一个热加载Class的小组件,这个组件需要对类加载器ClassLoader有所了解,我就顺便借这个机会把学到的一点皮毛与大家分享一下. 从Class文件开始 ClassLoader,顾名思义就 ...
- 类加载器ClassLoader
上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限定名来获取描述此类的二进制字节流,也即是 ...
- Java虚拟机学习(5):类加载器(ClassLoader
类加载器 类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 ...
- 深入理解Java类加载器(ClassLoader)
深入理解Java类加载器(ClassLoader) Java学习记录--委派模型与类加载器 关于Java类加载双亲委派机制的思考(附一道面试题) 真正理解线程上下文类加载器(多案例分析) [jvm解析 ...
随机推荐
- 《JavaScript权威指南》学习笔记 第八天 Node Tree
前几天介绍了DOM的知识,以及节点的操作.今天我们来重点理解下Node的属性以及方法. 在Document文档里属于Node的东西很多: 其中Document对象是Node对象最大的对象,平时我们使用 ...
- Low Power Consumption Design --- MCU Attention
20161008 note : I have a PCB board called 'A' where a piece of STM8L052C6 and a piece of CC1101 are ...
- WinForm------TreeList修改节点图标和按钮样式
转载: https://documentation.devexpress.com/#WindowsForms/DevExpressXtraTreeListTreeList_CustomDrawNode ...
- JS判断是wap端访问网站还是PC端访问,然后进行自动跳转的代码
<script type="text/javascript"> function goPAGE() { if ((navigator.userAgent.match(/ ...
- 基本药目录sop
http://db.yaozh.com/basicdir 基本药物 编辑 "基本药物"的概念, 由世界卫生组织于1977年提出,指的是能够满足基本医疗卫生需求,剂型适宜.保证供应. ...
- JavaWeb学习笔记——JSTL核心标签库
- Java数据库——JDBC 2.0操作
可滚动的结果集 让结果集滚动起来 //================================================= // File Name : JDBC20_demo //-- ...
- LaTeX Software & Manuals
LaTeX Software & Manuals How to Typeset Equations in LaTeX LaTeX is a very powerful tool for typ ...
- JSP-Servlet的工作流程
Servlet基础 1.Servlet概述 JSP的前身就是Servlet.Servlet就是在服务器端运行的一段小程序.一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问 ...
- [Unity] 精灵动画制作中需要注意的一些问题
1. 为精灵添加了动画控制器,UpdateMode设置为了Animate Physics,精灵就不受控制了,在游戏中不断的晃动,不受重力影响向下掉等奇葩问题出现了. 解决办法: 此类问题,除掉刚体设置 ...