因此,假设我们想要进行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;
JAXP旨在提供灵活性,允许您使用任何符合XML的标准 解析器来自您的应用程序。它通过所谓的方式实现 一个可插拔层,可以让你插入一个实现 SAX或DOM API。可插拔层还允许您插入 XSL处理器,可让您控制XML数据的显示方式。
这一层如何运作?我可以在申请表中写这样的吗?创建抽象类的实例?
答案 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
的具体实现的完全限定类名。