JAXP 插拔功能背后的层是什么



所以让我们确定我们想要进行 XSLT 转换并且想要使用。

 TransformerFactory transFact = TransformerFactory.newInstance(); (1)

所以newInstance((从抽象类创建对象,这在Java中是不可能的。那么后面发生了什么?Java 如何改变实现。我知道你可以直接使用

TransformerFactory transFact = new org.apache.xalan.processor.TransformerFactoryImpl();

但是这里我们有非抽象类的实例。或者我们可以使用

System.setProperty("javax.xml.transform.TransformerFactory",    
        "net.sf.saxon.TransformerFactoryImpl"); 

甚至是来自com.sun.org.apache.xalan.internal.xsltc.trax;的默认实现 (1(

JAXP 设计灵活,允许您使用任何符合 XML 标准的内容 应用程序中的分析器。它用所谓的 可插拔性层,允许您插入 SAX 或 DOM API。可插拔性层还允许您插入 XSL 处理器,允许您控制 XML 数据的显示方式。

此层如何工作?我可以在我的应用程序中写这样的吗?创建抽象类的内涵?

TransformerFactory.newInstance()的Javadoc详细描述了如何确定TransformerFactory的具体实现:

此方法使用以下顺序查找过程来确定 要加载的 TransformerFactory 实现类:

  • 使用 javax.xml.transform.TransformerFactory system 属性。
  • 使用 JRE 目录中的属性文件 "lib/jaxp.properties"。此配置文件位于标准 java.util.Properties 中 格式并包含实现的完全限定名称 类,键是上面定义的系统属性。这 jaxp.properties 文件仅由 JAXP 实现读取一次,并且 然后缓存它的值以备将来使用。如果文件不存在 当第一次尝试从中读取时,不再尝试 是为了检查它的存在。无法更改 jaxp.properties 中任何属性的值,在读取 第一次。
  • 使用服务 API(如 JAR 规范中所述(来确定类名(如果可用(。服务 API 将查找 文件中的类名 META-INF/services/javax.xml.transform.TransformerFactory in jars 可用于运行时。
  • 平台默认变压器工厂实例。

如果您想在应用程序中集成类似的工厂机制,我建议您查看服务 API。

newInstance()是一个

工厂方法,它创建具体类的实例,该实例是TransformerFactory的子类。

我没有调查源代码,但可以假设在一天结束时它使用 Class.forName() 来获取类,然后Class.newInstance()来获取实例。正如您自己提到的,工厂方法使用系统属性javax.xml.transform.TransformerFactory来获取TransformerFactory的具体实现的完全限定类名。

最新更新