Ответ 1
Трудно предсказать, какая конкретная реализация JAXP factory будет загружена без фактического создания экземпляра, потому что процесс выбора реализации.
Из Официальный вопрос JAXP (Вопрос 14):
Когда приложение хочет создать новый JAXP
DocumentBuilderFactory
Например, он вызывает статический методDocumentBuilderFactory.newInstance()
. Это вызывает поиск имени конкретный подклассDocumentBuilderFactory
, используя в следующем порядке:
- Значение системного свойства, такого как
javax.xml.parsers.DocumentBuilderFactory
, если оно существует и доступно.- Содержимое файла
$JAVA_HOME/jre/lib/jaxp.properties
, если оно существует.- Механизм обнаружения Jar Service Provider, указанный в спецификации Jar File. Файл jar может иметь ресурс (т.е. Встроенный файл), например
META-INF/services/javax.xml.parsers.DocumentBuilderFactory
, содержащий имя конкретного класса для создания экземпляра.- Реализация резервной платформы по умолчанию.
Добавляя эту сложность, каждый отдельный JAXP factory может иметь независимую реализацию. Обычно используется одна реализация парсера и другая реализация XSLT, но зернистость вышеописанного механизма выбора позволяет вам смешивать и сопоставлять в еще большей степени.
Следующий код выводит информацию о четырех основных фабриках JAXP:
private static void OutputJaxpImplementationInfo() {
System.out.println(getJaxpImplementationInfo("DocumentBuilderFactory", DocumentBuilderFactory.newInstance().getClass()));
System.out.println(getJaxpImplementationInfo("XPathFactory", XPathFactory.newInstance().getClass()));
System.out.println(getJaxpImplementationInfo("TransformerFactory", TransformerFactory.newInstance().getClass()));
System.out.println(getJaxpImplementationInfo("SAXParserFactory", SAXParserFactory.newInstance().getClass()));
}
private static String getJaxpImplementationInfo(String componentName, Class componentClass) {
CodeSource source = componentClass.getProtectionDomain().getCodeSource();
return MessageFormat.format(
"{0} implementation: {1} loaded from: {2}",
componentName,
componentClass.getName(),
source == null ? "Java Runtime" : source.getLocation());
}
Следующий примерный вывод иллюстрирует смешивание и соответствие трех различных реализаций JAXP (встроенных Xerces и внешних JAR для Xerces 2.8 и Xalan), работающих вместе:
DocumentBuilderFactory implementation: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl loaded from: file:/C:/Projects/Scratch/lib/xerces-2.8.0.jar
XPathFactory implementation: com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl loaded from: Java Runtime
TransformerFactory implementation: org.apache.xalan.processor.TransformerFactoryImpl loaded from: file:/C:/Projects/Scratch/lib/xalan.jar
SAXParserFactory implementation: org.apache.xerces.jaxp.SAXParserFactoryImpl loaded from: file:/C:/Projects/Scratch/lib/xerces-2.8.0.jar