Я также не уверен, под чем Вы подразумеваете чистый
В 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);
...
}
Довольно сложно предсказать, какая конкретная реализация фабрики JAXP будет загружена без фактического создание экземпляра, потому что процесс выбора реализации.
Из официальных часто задаваемых вопросов JAXP (вопрос 14):
Когда приложение хочет создать новый JAXP
DocumentBuilderFactory
например, он вызывает метод staicDocumentBuilderFactory.newInstance ()
. Это вызывает поиск имени конкретный подклассDocumentBuilderFactory
с использованием в следующем порядке:
- Значение системного свойства, например
javax.xml.parsers.DocumentBuilderFactory
, если оно существует и доступно.- Содержимое файла
$ JAVA_HOME / jre / lib /jaxp.properties
, если он существует.- Механизм обнаружения поставщика услуг Jar, указанный в Спецификации файла Jar. Файл jar может иметь ресурс (т.е. встроенный файл), например
META-INF / services / javax.xml.parsers.DocumentBuilderFactory
, содержащий имя конкретного класса для создания экземпляра.- Резервная платформа реализация по умолчанию.
Кроме того, эта сложность усложняется тем, что для каждой отдельной фабрики 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
Это зависит, но обычно нет.
DocumentBuilderFactory.newInstance ()
либо вернет реализацию DocumentBuilderFactory
, которая настроена в системном свойстве "javax .xml.parsers.DocumentBuilderFactory "или фабрику JRE по умолчанию, если системное свойство не установлено. Фабрика по умолчанию, скорее всего, жестко запрограммирована в реализации метода newInstance и недоступна иным образом.
Если задано системное свойство, вы можете по крайней мере использовать метод getResource в соответствующем загрузчике классов, чтобы получить URL-адрес, из которого загрузчик классов загрузит соответствующий файл класса. Если это из файла jar, вы сможете извлечь имя файла (или URL-адрес источника) из URL-адреса jar :.