2013-08-09 2 views
1

Могу ли я использовать метод определения класса ClassLoader для переопределения некоторых пакетов изнутри банки?Переопределение классов в Java

Например, приложение в настоящее время содержит «javax.xml.bind» из abc.jar. Если я вызываю ClassLoader.definePackage (def.jar), в котором def.jar содержит другую версию javax.xml.bind, могу ли я заменить путь к классу для всего приложения так, чтобы он указывал на def.jar? Благодарю.

+1

Зачем вам это нужно? –

+0

Простейшей задачей является поставить свою банку впереди другой в порядке поиска. ClassLoader.definePackage не делает ничего полезного для вас. –

ответ

2

Нет, вы определенно можете не использовать ClassLoader.definePackage для «переопределения» некоторых пакетов изнутри банки.

Если я правильно понял, вы хотите, чтобы ваша JVM загружала любой класс под javax.xml.bind из def.jar, а все остальные из abc.jar. В этом случае вы можете (в моем личном порядке предпочтения):

1) Поместите def.jar перед abc.jar в CLASSPATH. Это требует, чтобы ни один класс, который вы хотите загрузить из abc.jar, присутствует в def.jar.

2) Разархивируйте def.jar, abc.jar или и то, и другое, и удалите любые конфликтующие классы, поэтому на самом деле не имеет значения, какой jar будет первым в CLASSPATH. Затем повторно застегните их. Или вы можете сделать это только на одной банке и поставить ее перед другой.

3) Используйте настраиваемый загрузчик классов (извините, не общедоступное доменное имя, о котором я знаю, дайте мне знать, если вы его найдете). Это может быть интересной темой для проекта ОС, за исключением того, что уже несколько инициатив с похожими (но гораздо более широкими) целями, некоторые из которых лежат в основе языка.

4) Создайте загрузчик классов для этой цели, возможно, расширив его по умолчанию.

+0

OSGi может сделать то, о чем вы говорите в № 3, хотя это довольно инвазивно для структуры приложения. – chrylis

+0

@chrylis Вы абсолютно правы. И есть не менее 3 версий Open Source. Но, как вы говорите, слишком много лишнего, чтобы упомянуть об этом как альтернативе. –

+0

Больше перехитрить, чем переписывать загрузчик классов? O :-) – chrylis

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