В коде моей библиотеки я загружаю имена классов из XML-файла с помощью JAXB, чтобы позже их использовать, используя Class.forName()
. Фиктивный пример, чтобы проиллюстрировать случай:Есть ли альтернатива загрузке класса с классом.forName()?
public void libraryMethod() throws Exception {
List<String> classNames = loadClassNamesFromXML();
for (String className : classNames) {
Class.forName(className).newInstance().doThings();
}
}
Теперь, некоторые пользователи используют OSGi настроить свои приложения, и они загружают мою библиотеку с другим загрузчиком классов, чем классы они настраивают, используя мою структуру XML. Это означает, что загрузка может завершиться неудачей, поскольку класс не может быть найден.
Есть ли более надежный способ загрузки таких классов? Или есть ли другой способ настроить эти экземпляры? Я открыт для предложений, которые приводят к этим:
public void libraryMethod() throws Exception {
// Spring does things like this:
List<SomeType> instances = loadInstancesFromXML();
for (SomeType instance : instances) {
instance.doThings();
}
}
Некоторые ограничения:
- из библиотеки точки зрения, жизненный цикл этих случаев не имеет значения. Если у них (пользовательское) состояние, моя библиотека не заметила бы.
- Я хочу, чтобы в этой библиотеке было все просто, поэтому я хочу, например, избегать создания внешних зависимостей в инфраструктурах конфигурации, таких как spring. Поэтому меня интересуют только решения, которые могут быть достигнуты при использовании стандартных дистрибутивов JDK 6+.
- Мне бы очень хотелось сохранить простой файл конфигурации XML (небольшие адаптации к структуре XML в порядке).
Вы уже достаточно глубоко в специальном решении, не показывая реальную проблему, которую пытаетесь решить. Можете ли вы объяснить, что делает ваша xml-конфигурация, и почему вы должны загружать классы из других пакетов без импорта своих пакетов? –
@ChristianSchneider: Я пишу библиотеку ([jOOQ] (http://www.jooq.org)). Я не могу импортировать произвольные пользовательские пакеты, но я хотел бы, чтобы пользователи библиотеки могли внедрять реализации «SomeType» в мою библиотеку. С весной было бы довольно легко вводить такие реализации, но это означало бы, что моя библиотека будет иметь «тяжелую» зависимость от самой пружины. –
Проделайте некоторое исследование, прежде чем задавать вопрос, идите для размышления (ленивое посвящение) – Pawan