JAXP插件功能背后有什么层?

时间:2016-02-14 14:52:12

标签: java xml xslt jaxp

因此,假设我们想要进行XSLT转换,我们想要使用。

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

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

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

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

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数据的显示方式。

这一层如何运作?我可以在申请表中写这样的吗?创建抽象类的实例?

2 个答案:

答案 0 :(得分:0)

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

  

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

     
      
  • 使用javax.xml.transform.TransformerFactory系统属性。
  •   
  • 使用JRE目录中的属性文件“lib / jaxp.properties”。此配置文件位于标准java.util.Properties中   format并包含实现的完全限定名称   密钥是上面定义的系统属性的类。该   jaxp.properties文件只能由JAXP实现读取一次   然后缓存它的值以供将来使用。如果该文件不存在   当第一次尝试从中读取时,不再进行尝试   是为了检查它的存在。无法改变   读取之后jaxp.properties中任何属性的值   第一次。
  •   
  • 使用Services API(如JAR规范中详述)(如果可用)来确定类名。 Services API将寻找   文件中的类名   罐子里的META-INF / services / javax.xml.transform.TransformerFactory   可用于运行时。
  •   
  • 平台默认的TransformerFactory实例。
  •   

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

答案 1 :(得分:0)

newInstance()是一个工厂方法,它创建具体类的实例,该实例是TransformerFactory的子类。

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