Как я узнаю, какая реализация JAXP используется и где она была загружена из?

Я также не уверен, под чем Вы подразумеваете чистый

В C++, который мы используем

#include <cstdarg>
#include <cstdio>

class Foo
{   void Write(const char* pMsg, ...);
};

void Foo::Write( const char* pMsg, ...)
{
    char buffer[4096];
    std::va_list arg;
    va_start(arg, pMsg);
    std::vsnprintf(buffer, 4096, pMsg, arg);
    va_end(arg);
    ...
}
30
задан Daniel Fortunov 25 November 2009 в 17:06
поделиться

2 ответа

Довольно сложно предсказать, какая конкретная реализация фабрики JAXP будет загружена без фактического создание экземпляра, потому что процесс выбора реализации.

Из официальных часто задаваемых вопросов JAXP (вопрос 14):

Когда приложение хочет создать новый JAXP DocumentBuilderFactory например, он вызывает метод staic DocumentBuilderFactory.newInstance () . Это вызывает поиск имени конкретный подкласс DocumentBuilderFactory с использованием в следующем порядке:

  1. Значение системного свойства, например javax.xml.parsers.DocumentBuilderFactory , если оно существует и доступно.
  2. Содержимое файла $ JAVA_HOME / jre / lib /jaxp.properties, если он существует.
  3. Механизм обнаружения поставщика услуг Jar, указанный в Спецификации файла Jar. Файл jar может иметь ресурс (т.е. встроенный файл), например META-INF / services / javax.xml.parsers.DocumentBuilderFactory , содержащий имя конкретного класса для создания экземпляра.
  4. Резервная платформа реализация по умолчанию.

Кроме того, эта сложность усложняется тем, что для каждой отдельной фабрики JAXP можно указать независимую реализацию. Обычно используется одна реализация парсера и другая реализация 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
54
ответ дан 27 November 2019 в 23:32
поделиться

Это зависит, но обычно нет.

DocumentBuilderFactory.newInstance () либо вернет реализацию DocumentBuilderFactory , которая настроена в системном свойстве "javax .xml.parsers.DocumentBuilderFactory "или фабрику JRE по умолчанию, если системное свойство не установлено. Фабрика по умолчанию, скорее всего, жестко запрограммирована в реализации метода newInstance и недоступна иным образом.

Если задано системное свойство, вы можете по крайней мере использовать метод getResource в соответствующем загрузчике классов, чтобы получить URL-адрес, из которого загрузчик классов загрузит соответствующий файл класса. Если это из файла jar, вы сможете извлечь имя файла (или URL-адрес источника) из URL-адреса jar :.

1
ответ дан 27 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: