我有一个非常基本的疑问。请帮助我理解此链接中的以下几行 http://docs.oracle.com/javase/1.5.0/docs/guide/xml/jaxp/JAXP-Compatibility_150.html
" JAXP 1.3参考名称中的解决方案是更改实现中使用的Apache库的包名称。这一更改使您可以在类路径中引用较新的Apache库,因此应用程序开发人员可以使用它们,就像使用Java平台的任何其他添加项一样#34;
如何使用类路径中的引用库中的同名类覆盖jre的内部实现类? 注意:我假设他们只提供了包装器来更改内部包名的名称,因此内部包名仍应存在。
请详细解释。
提前致谢!!! 阿南德
答案 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的角度来看,它们是完全不同的类。