Java –手工Classloader隔离

在最近的项目中,我们遇到了一个典型的库冲突问题 。 我们可以控制的一个组件需要特定版本的Apache Commons库,而另一个组件则需要一个不同的版本。 由于外部限制, 我们无法在Container级别指定任何类加载隔离 。 这不是我们的选择。 相反,我们决定要做的是同时使用两个不同的类定义。 为此,我们必须让当前线程类加载器加载一个类,并手动加载第二个 ; 这样,这两个类仍具有相同的完全限定名称。

这种方法的唯一限制是,我们只能通过反射与手动加载的类进行交互,因为当前上下文使用的是不同的类加载器,
具有不同的类定义,我们可以将加载有类加载器的类的实例强制转换或分配给在另一个上下文中定义的变量。 实际上,我们的实现是Classloader本身:

DirectoryBasedParentLastURLClassLoader extends ClassLoader

这个Classloader的特点是我们给它传递了一个文件系统文件夹路径

public DirectoryBasedParentLastURLClassLoader(String jarDir)

我们的实现扫描文件系统路径以生成URL,并使用此信息将它们传递给我们用CustomClassloader封装的URLClassLoader的包装实例

public DirectoryBasedParentLastURLClassLoader(String jarDir) {super(Thread.currentThread().getContextClassLoader());// search for JAR files in the given directoryFileFilter jarFilter = new FileFilter() {public boolean accept(File pathname) {return pathname.getName().endsWith('.jar');}};// create URL for each JAR file foundFile[] jarFiles = new File(jarDir).listFiles(jarFilter);URL[] urls;if (null != jarFiles) {urls = new URL[jarFiles.length];for (int i = 0; i < jarFiles.length; i++) {try {urls[i] = jarFiles[i].toURI().toURL();} catch (MalformedURLException e) {throw new RuntimeException('Could not get URL for JAR file: ' + jarFiles[i], e);}}} else {// no JAR files foundurls = new URL[0];}childClassLoader = new ChildURLClassLoader(urls, this.getParent());
}

通过此设置,我们可以覆盖主要类加载功能的行为,仅当能够找到请求的类时,才优先考虑从文件夹中进行加载并回落到父类加载器

@Override
protected synchronized ClassloadClass(String name, boolean resolve)throws ClassNotFoundException {try {// first try to find a class inside the child classloaderreturn childClassLoader.findClass(name);} catch (ClassNotFoundException e) {// didn't find it, try the parentreturn super.loadClass(name, resolve);}
}

有了我们的CustomClassloader之后,我们可以通过以下方式使用它:

//instantiate our custom classloader
DirectoryBasedParentLastURLClassLoader classLoader = new DirectoryBasedParentLastURLClassLoader(ClassLoaderTest.JARS_DIR    );
//manually load a specific class
ClassclassManuallyLoaded = classLoader.loadClass('paolo.test.custom_classloader.support.MyBean');
//request a class via reflection
Object myBeanInstanceFromReflection = classManuallyLoaded.newInstance();
//keep using the class via reflection
Method methodToString = classManuallyLoaded.getMethod('toString');
assertEquals('v1', methodToString.invoke(myBeanInstanceFromReflection));

这篇文章的想法及其部分代码来自有关Stackoverflow的有趣讨论。 GitHub上提供了一个可以正常运行的Maven项目,并进行了大量的单元测试以验证正确的行为。

参考: Java –我们的JCG合作伙伴 Paolo Antinori的Handmade Classloader Isolation在Someday Never Comes博客上发表。

翻译自: https://www.javacodegeeks.com/2013/03/java-handmade-classloader-isolation.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【知识梳理1】Android触摸事件机制

前言 随着科学技术的发展&#xff0c;智能手机早已成为我们当代人身边不可缺少的“伙伴”之中的一个&#xff0c;堪比对象女友。每天我们对着手机反复的做着点击、滑动操作&#xff0c;而手机则随着我们的操作给我们展示她的精彩。… 废话到此结束。 看到这里&#xff0c;即使…

matlab if m不等于0,matlab问题clearfor a=0.1:0.1:50for b=0.1:0.1:20for m=0.1:0.1:5

来源&#xff1a;学生作业帮 编辑&#xff1a;作业帮 分类&#xff1a;综合作业 时间&#xff1a;2021/03/23 06:16:09matlab问题clearfor a0.1:0.1:50for b0.1:0.1:20for m0.1:0.1:5for k1:1:15n(a*m)/(2*b)-m^2;z4*k-a*m;x(4*k-a*m)/(4*k-2*b*(m^2n));y(4*k-a*m)/(4*k-2*b*m^…

自己做的一个登录页面,纯代码!

先上效果图吧. 本人菜鸟入门, 请勿喷. 首先样式: 1 1 body{2 2 margin: 0;3 3 padding: 0;4 4 width: 100%;5 5 height: 100%;6 6 }7 7 8 8 .headers{9 9 width: 100%;10 10 height: 100px;11 11 }12 12 .siv-ng{13 13 width:…

ASP.NET调用cmd命令提示符拒绝访问解决方案

using System.Diagnostics; public class CmdHelper{private static string CmdPath "C:\Windows\System32\cmd.exe";/// <summary>/// 执行cmd命令/// 多命令请使用批处理命令连接符&#xff1a;/// <![CDATA[/// &:同时执行两个命令/// |:将上一个命…

Java 7:Fork / Join框架示例

Java 7中的Fork / Join Framework专为可分解为较小任务的工作而设计&#xff0c;并将这些任务的结果组合起来以产生最终结果。 通常&#xff0c;使用Fork / Join Framework的类遵循以下简单算法&#xff1a; // pseudocode Result solve(Problem problem) {if (problem.size &…

php上传文件 服务器内部错误,php – 在将图像上传到S3时遇到内部服务器错误500...

在将图像上传到S3时我遇到了一个问题.我正在使用S3类和jqueryimageuploader插件.我已经设置了基本的应用程序,它在我的本地机器上运行良好.当我在beanstalk上部署它时,它开始抛出错误.我已经附加了控制台快照.我在这里添加我的代码供参考.这是启动文件index.html –gt;Meta cha…

Some reading, some thinking.

update&#xff1a;感谢助教0 0又学会一招&#xff0c;play 了一下CSS Part 1 Reading AuthorArticleNoteMadcola《两年波折路&#xff08;考研、工作、考研&#xff09;》"吾志所向&#xff0c;一往无前&#xff1b;愈挫愈奋&#xff0c;再接再励。"辜新星《时刻调…

CSS选择器:伪类(图文详解)

本文最初发表于博客园&#xff0c;并在GitHub上持续更新前端的系列文章。欢迎在GitHub上关注我&#xff0c;一起入门和进阶前端。 以下是正文。 伪类&#xff08;伪类选择器&#xff09; 伪类&#xff1a;同一个标签&#xff0c;根据其不同的种状态&#xff0c;有不同的样式。…

了解播放过滤器API

随着Play 2.1的热销&#xff0c;很多人开始询问新的Play过滤器API。 实际上&#xff0c;API非常简单&#xff1a; trait EssentialFilter {def apply(next: EssentialAction): EssentialAction }本质上&#xff0c;过滤器只是一个执行一个动作并返回另一个动作的函数。 过滤器…

mybatis 使用merge into

前一篇博客&#xff0c;oracle的merge into语法 &#xff1a; oracle merge into语法 mybatis 使用merge into&#xff0c;跟一般的update写法相同&#xff1a; <update id"mergeinfo">merge into user_type ausing ( select #{name} as name, #{type} as type…

php getbyid,ThinkPHP查询中的魔术方法简述

我们在使用thinkphp开发的时候&#xff0c;有时候会用到getById(1)这个方法快速的获取一条信息的内容&#xff0c;这个方法比用where(" id 1 ")->find()好用多了&#xff0c;同时查询效率也比find快速。很多人在刚开始接触这个方法的时候&#xff0c;没有多留意它…

DIV固定宽度和动态拉伸混合水平排列

1.效果图 2.源代码 html <h2>1.头部固定&#xff0c;尾部拉伸</h2> <div class"container" id"div1"><div class"head"></div><div class"tail"></div> </div><h2>2.尾部固定…

bzoj1941 [Sdoi2010]Hide and Seek

Description 小猪iPig在PKU刚上完了无聊的猪性代数课&#xff0c;天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞&#xff0c;为了消除寂寞感&#xff0c;他决定和他的好朋友giPi&#xff08;鸡皮&#xff09;玩一个更加寂寞的游戏—捉迷藏。 但是&#xff0c;他们觉得…

ubuntu修改ssh服务的端口号

一、找到ssh配置文件位置 vim /etc/ssh/sshd_config 二、修改ssh登录端口号 修改 port 22 为 port xxxx 三、重启ssh服务 /etc/init.d/ssh restart转载于:https://www.cnblogs.com/javafucker/p/8521316.html

使用CSS设置JavaFX饼图样式

渲染图表时&#xff0c; JavaFX默认提供某些颜色。 但是&#xff0c;在某些情况下&#xff0c;您想自定义这些颜色。 在此博客文章中&#xff0c;我将使用一个示例来更改JavaFX饼图的颜色&#xff0c;该示例打算在今天下午在RMOUG Training Days 2013的演示中包括。一些基于Jav…

python列表去重效率,你应该知道的python列表去重方法

前言列表去重是写Python脚本时常遇问题&#xff0c;因为不管源数据来自哪里&#xff0c;当我们转换成列表的方式时&#xff0c;有可能预期的结果不是我们最终的结果&#xff0c;最常见的就是列表中元素有重复&#xff0c;这时候第一件事我们就要做去重处理。我们先来个最简单的…

java 错误: 找不到或无法加载主类

这个问题应该很常见的&#xff0c;笔者经常手工编译一些测试代码或者小工具&#xff0c;经常用到 javac和java来编译并运行一些简单的小工具。 以Hello World来测试。 HelloWorld.java public class HelloWorld{public static void main(String[]args){System.out.println(&quo…

HTML 表单 存为EXCEL文件时 中文显示乱码

在做宣传品发放系统时&#xff0c;需求要把数据库查询的记录生成表单并转存excel文件。 在转存的EXCEL文件中文显示乱码&#xff0c;表格和其他字符正常&#xff0c;检查后发现是创建EXCEL文件打开模式不对 之前&#xff1a; myfile fs.CreateTextFile(filename,true) 之后…

在Visual Studio Code中配置GO开发环境

一、GO语言安装 详情查看&#xff1a;GO语言下载、安装、配置 二、GoLang插件介绍 对于Visual Studio Code开发工具&#xff0c;有一款优秀的GoLang插件&#xff0c;它的主页为&#xff1a;https://github.com/microsoft/vscode-go 这款插件的特性包括&#xff1a; Colorizatio…

最受欢迎的应用服务器

这是本系列的第二篇文章&#xff0c;我们将发布有关Java安装的统计数据。 使用的数据集来自免费的Plumbr安装&#xff0c;在过去六个月中&#xff0c;我们总共收集了1,024个不同的环境。 本系列的第一篇文章分析了基础-运行JVM的操作系统&#xff0c;是32位还是62位基础架构以…