我有一个非常基本的怀疑。请帮助我理解150.html链接中的以下几行
JAXP1.3引用名中的解决方案是更改在实现中使用的Apache库的包名。这种更改使您可以在类路径中引用较新的Apache库,这样应用程序开发人员就可以使用它们的方式与使用Java平台上的任何其他添加项的方式相同。
如何用类路径中引用库中的同名类重写jre的内部实现类?注意:我假设他们只提供包装包来更改内部包名的名称,所以内部包名应该仍然存在。
请详细解释。
提前谢谢!阿南德
发布于 2014-09-05 18:46:02
以前,JRE中包含的一些org.apache包是"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的角度来看,它们是完全不同的类。
https://stackoverflow.com/questions/25692037
复制相似问题