jaxp内部类如何工作?

时间:2014-09-05 18:41:19

标签: java compatibility jaxp package-name internal-class

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

" JAXP 1.3参考名称中的解决方案是更改实现中使用的Apache库的包名称。这一更改使您可以在类路径中引用较新的Apache库,因此应用程序开发人员可以使用它们,就像使用Java平台的任何其他添加项一样#34;

如何使用类路径中的引用库中的同名类覆盖jre的内部实现类? 注意:我假设他们只提供了包装器来更改内部包名的名称,因此内部包名仍应存在。

请详细解释。

提前致谢!!! 阿南德

1 个答案:

答案 0 :(得分:0)

以前一些org.apache包中包含在JRE jar中的“as-is”,包含完整的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的角度来看,它们是完全不同的类。