2014-09-05 9 views
0

У меня есть очень серьезные сомнения. Пожалуйста, помогите мне понять следующие строки из этой ссылки http://docs.oracle.com/javase/1.5.0/docs/guide/xml/jaxp/JAXP-Compatibility_150.htmlКак работают внутренние классы jaxp?

«Решение в опорном имени JAXP 1.3 изменить имена пакетов библиотек Apache, используемых в реализации. Это изменение позволяет ссылаться на новые библиотеки Apache в classpath, поэтому разработчики приложений могут использовать их так же, как и любые другие дополнения к платформе Java »

Как переопределить внутренний класс реализации jre с классом того же имени из справочной библиотеки в пути к классам? Примечание. Я предполагаю, что они только предоставили пакет-оболочку для изменения имени внутренних имен пакетов, поэтому имя внутреннего пакета должно все еще существовать.

Пожалуйста, объясните подробно.

Заранее благодарен! Anand

ответ

0

Раньше некоторые пакеты org.apache, в которые включены JRE jars «as-is», с полными именами пакетов org.apache.

Это означает, что, если класс мой хотел использовать, скажем, Xerces DomUtil и имел

import org.apache.xerces.util.DOMUtil; 

корень загрузчика классов будет решать этот класс версии Xerces в JRE.

Если бы я хотел использовать новую или другую версию Xerces, я не мог бы включить ее в свой путь к классам приложений, потому что система загрузчика классов будет иметь преимущество перед Xerces, упакованными в JRE.

Теперь эта ситуация изменилась. Они взяли пакеты org.apache и изменили их на com.sun.org.apache ... internal ...

Итак, если я хочу напрямую использовать Xerces, упакованные в JRE, я могу импортировать:

import com.sun.org.apache.xerces.internal.util.DOMUtil; 

(Затмение будет давать ошибку говоря нам не использовать пакеты внутри com.sun .. но все-таки класс есть, и мы можем изменить ограничения доступа, если мы хотим)

Эта версия используется всеми классы JRE, такие как JAXP.

Это позволило мне добавить в свой класс путь к новой версии, если Xerces и использовать его из моего приложения, не мешая JRE.

Они были переупакованы путем простого переименования пакета. Это означает, что перемещение его от, например, в папке

org/apache/xerces/util 

в папку

com/sun/org/apache/xerces/internal/util 

на жестком диске некоторого JRE парня, а затем изменить внутри.Java-файлы по

package org.apache.xerces.util; 

в

package com.sun.org.apache.xerces.internal.util; 

Таким образом, с точки JVM зрения, они совершенно разные классы.

+0

Hi Simone, Спасибо за ваш ответ, но если эти старые пакеты «org.apache» все еще существуют, то как будут проходить классы из пути класса. В JRE старые пакеты были удалены или были только переименованы (написав класс-оболочку, который просто наследует старый класс apache)? Это было мое сомнение. Просьба уточнить. – user3292957

+0

Я уточнил ответ, пожалуйста, примите его, если вы думаете, что он отвечает на ваш вопрос. –

+0

Привет, Симоне, Спасибо за разъяснение. В JRE 7-> xml.jar я видел, что старые пакеты все еще существуют. Например, пакет org.apache.xpath все еще присутствует в jre7. Вот почему им трудно понять эту концепцию. Если все еще существует, как загружаются новые библиотеки с таким же именем из пути класса? Пожалуйста, обратите внимание на jre jar, чтобы вы могли понять и помочь мне лучше. Спасибо за ваше терпение – user3292957