2016-02-14 2 views
0

Так что давайте предположим, что хотим преобразовать XSLT и хотим использовать.Какой уровень стоял за возможностями подключения JAXP?

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

Так что newInstance() создает объект из абстрактного класса, что невозможно в Java. ТАК, что происходит? Как Java меняет реализацию. Я знаю, что вы можете использовать directlly

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

но здесь мы имеем экземпляр неэкстремального класса. Или мы можем использовать

System.setProperty("javax.xml.transform.TransformerFactory",  
     "net.sf.saxon.TransformerFactoryImpl"); 

или даже реализация по умолчанию (1) от com.sun.org.apache.xalan.internal.xsltc.trax;

Разработанный, чтобы быть гибким, JAXP позволяет использовать любой XML-совместимый анализатор из вашего приложения. Он делает это с так называемым слоем подключаемости, который позволяет подключать реализацию SAX или DOM API . Уровень подключаемости также позволяет подключать XSL-процессор , позволяя вам контролировать, как отображаются ваши XML-данные.

Как работает этот слой? Могу ли я написать такое в своем приложении? Создать instace абстрактного класса?

+0

Они никогда не создают экземпляр абстрактного класса, а только экземпляр класса, который * расширяет * абстрактный класс. Весь этот слой конфигурации вокруг него должен указывать, какой класс необходимо создать, когда запрашивается экземпляр абстрактного класса. – dasblinkenlight

ответ

0

Javadoc из TransformerFactory.newInstance() подробно описывает, как определяется конкретная реализация TransformerFactory:

Этот метод использует следующую упорядоченную процедуру поиска для определения класс реализации TransformerFactory к нагрузке:

  • Используйте свойство системы javax.xml.transform.TransformerFactory.
  • Используйте файл свойств "lib/jaxp.properties" в каталоге JRE. Этот файл конфигурации находится в стандартном формате java.util.Properties и содержит полное имя класса реализации , при этом ключ является системным свойством, определенным выше. Файл jaxp.properties от читается только один раз реализацией JAXP, а значения затем кэшируются для использования в будущем. Если файл не существует , когда первая попытка сделана для его считывания, дальнейшие попытки не выполняются, чтобы проверить его существование. Невозможно изменить значение любого свойства в jaxp.properties после того, как оно было прочитано для в первый раз.
  • Используйте API-интерфейс служб (как указано в спецификации JAR), если доступно, для определения имени класса. API-интерфейс служб будет искать имя класса в файле META-INF/services/javax.xml.transform.TransformerFactory в баночках , доступных для выполнения.
  • Экземпляр TransformerFactory по умолчанию для платформы.

Если вы хотите интегрировать подобный механизм фабрики в приложении я рекомендовал бы взглянуть на API служб.

+0

OK Я видел поток раньше, но как JDK это делает? Он использует отражение, а затем время выполнения на основе этих критериев, чтобы подключить правильную реализацию? – Xelian

+0

Xelian: результаты поиска в имени класса, а остальное - 'Class.forName(). NewInstance()' – wero

0

newInstance() - метод фабрики, который создает экземпляр конкретного класса, который является подклассом TransformerFactory.

Я не исследовал исходный код, но могу предположить, что в конце дня он использует Class.forName() для получения класса, а затем Class.newInstance() для получения экземпляра. Как вы уже упоминали, существует заводской метод использует свойство системы javax.xml.transform.TransformerFactory, чтобы получить полное имя класса конкретной реализации TransformerFactory.

Смежные вопросы