0

我有一个非常基本的疑问。请帮助我从这个链接 http://docs.oracle.com/javase/1.5.0/docs/guide/xml/jaxp/JAXP-Compatibility_150.html理解以下几行

“JAXP 1.3 引用名称中的解决方案是更改实现中使用的 Apache 库的包名称。该更改允许您在类路径中引用较新的 Apache 库,因此应用程序开发人员可以像使用任何Java 平台的其他补充”

如何用类路径中引用库中的同名类覆盖jre的内部实现类?注意:我假设他们只给了 wrapper 包来更改内部包名的名称,所以内部包名应该仍然存在。

请详细说明。

提前致谢!!!阿南德

4

1 回答 1

0

以前,一些 org.apache 包“按原样”包含在 JRE jar 中,具有完整的 org.apache 包名称。

这意味着,如果我的一个类想要使用,比如说,Xerces DomUtil,并且有一个

import org.apache.xerces.util.DOMUtil;

根类加载器会将此类解析为 JRE 中的 Xerces 版本。

如果我想使用更新或不同版本的 Xerces,我不能将它包含在我的应用程序类路径中,因为类加载器系统会优先考虑打包在 JRE 中的 Xerces。

现在这种情况发生了变化。他们获取了 org.apache 包,并将它们更改为 com.sun.org.apache...internal...

所以,如果我想直接使用 JRE 打包的 Xerces,我可以导入:

import com.sun.org.apache.xerces.internal.util.DOMUtil;

(Eclipse 会报错,告诉我们不要在 com.sun 中使用包 .. 但类仍然存在,如果我们愿意,我们可以更改访问限制)

所有 JRE 类(如 JAXP)都使用此版本。

这让我可以自由地将更新版本的 Xerces 放入我的类路径,并在我的应用程序中使用它,而不会干扰 JRE 的。

通过简单地重命名包来重新打包它们。这意味着将其从例如文件夹中移出

org/apache/xerces/util

到文件夹

com/sun/org/apache/xerces/internal/util

在一些 JRE 人的硬盘上,然后在 .java 文件中更改

package org.apache.xerces.util;

package com.sun.org.apache.xerces.internal.util;

因此,从 JVM 的角度来看,它们是完全不同的类。

于 2014-09-05T18:46:02.487 回答