2012-02-25 109 views
1

我已经更改了共享库中的类的包。我有消费者A和B消费这个图书馆。消费者A也使用消费者B.Java是否支持类型转发?

我正在使用Consumer A,我已经更新了共享库的.jar文件。现在在运行时,我得到一个java.lang.NoClassDefFoundError为旧的包,大概,因为消费者B仍然使用它(这是使用春季DI,有大量的依赖关系,我刚开始在Java中工作,所以我不是100%确定,但它可能来自哪里)。

在.net中,我可以使用Type Forwarding来临时修复这种情况,直到我还可以更新Consumer B.在Java中是否也存在类似的机制? (“当有人要求de.stum.old.MyObject时,请将它们发送到de.stum.new.MyObject而不是”)

+0

什么是“命名空间”?你的意思是“包装”? – yegor256 2012-02-25 02:24:35

+0

@ yegor256啊,是的,谢谢!更新了问题 – 2012-02-25 02:30:02

回答

2

不,JVM没有类型转发功能。您必须采取另一种方法:

您可以将新类定义为旧类的子类(或其他方法),并且保留两个类直到所有使用者都更新。当然,唯一允许消费者向一个方向传递MyObjects。

如果你不需要赋值兼容性,你可以同时加载旧的和新的jar(假设没有名称冲突,例如因为所有的类都被移动到一个新的包中。冲突,你可能希望使用单独的类加载器来解决它们)。

当然,如果你想获得真正的幻想,当你使用字节码操作库加载引用类时,可以替换移动类的引用。