首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java -如何加载同一个类的不同版本?

Java -如何加载同一个类的不同版本?
EN

Stack Overflow用户
提问于 2012-08-01 20:37:58
回答 4查看 29.2K关注 0票数 44

我读了很多关于Java类加载器的文章,但到目前为止,我还没有找到这个简单问题的答案:

我在jars中有两个版本的com.abc.Hello.classv1.jarv2.jar。我想在我的应用程序中同时使用这两种方法。执行此操作的最简单方法是什么?

我并不期望这么简单,但以下内容将是非常棒的:

Classloader myClassLoader = [magic that includes v1.jar and ignores v2.jar]
Hello hello = myclassLoader.load[com.abc.Hello]

在一个不同的类中:

Classloader myClassLoader = [magic that includes v2.jar and ignores v1.jar]
Hello hello = myclassLoader.load[com.abc.Hello]

我想避免使用OSGi。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-01 20:47:42

你走对了路。你必须考虑到一些事情。

正常的事情是使用父类加载器中存在的类。因此,如果你想要两个版本,这些类就不能存在。

但是如果你想进行交互,你可以使用反射,或者更好的通用接口。因此,我将这样做:

common.jar:
BaseInterface

v1.jar:
SomeImplementation implements BaseInterface

v2.jar:
OtherImplementation implements BaseInterface

command-line:
java -classpath common.jar YourMainClass
// you don't put v1 nor v2 into the parent classloader classpath

Then in your program:

loader1 = new URLClassLoader(new URL[] {new File("v1.jar").toURL()}, Thread.currentThread().getContextClassLoader());
loader2 = new URLClassLoader(new URL[] {new File("v2.jar").toURL()}, Thread.currentThread().getContextClassLoader());

Class<?> c1 = loader1.loadClass("com.abc.Hello");
Class<?> c2 = loader2.loadClass("com.abc.Hello");

BaseInterface i1 = (BaseInterface) c1.newInstance();
BaseInterface i2 = (BaseInterface) c2.newInstance();
票数 52
EN

Stack Overflow用户

发布于 2012-08-01 20:43:39

你几乎已经写好了解决方案。我希望下面的代码片段能有所帮助。

ClassLoader cl = new URLClassLoader(new URL[] {new File("v1.jar").toURL()}, Thread.currentThread().getContextClassLoader());
Class<?> clazz = cl.loadClass("Hello");

v1.jar替换为v2.jar,此代码将加载版本2。

票数 9
EN

Stack Overflow用户

发布于 2016-02-14 03:26:54

有关@helios checkout github.com/atulsm/ElasticsearchClassLoader接受答案的示例实现,请参阅

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11759414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档