Пользовательский загрузчик классов в Constructor.newInstance

Я использую rhino через структуру сценариев bean-компонентов для создания и настройки объектов в моем java-процессе. Некоторые классы, используемые в сценариях, необходимо загружать динамически, поскольку они не всегда будут находиться в стандартном пути к классам.

Чтобы загрузить эти классы, я инициализирую фабрику контекста среды сценариев с помощью специального загрузчика классов, который загружает эти классы из вспомогательного каталога. Это хорошо работает.

Проблема в том, что некоторые из этих классов в своих конструкторах используют другие классы, которые также должны быть загружены из этого вспомогательного каталога. Глядя на источник, я вижу, что движок javascript просто вызывает Constructor.newInstance.

Как узнать, какой загрузчик классов использует вызов newInstance, и могу ли я внедрить свой собственный, чтобы вручную загружать классы, которые стандартный загрузчик классов не знает, как загружать.


person user14128    schedule 30.10.2009    source источник


Ответы (2)


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

ClassLoader myLoader = new ClassLoader(getClass().getClassLoader()) { 
... your code loading from custom directory ...
}

Классы, загруженные из вашего загрузчика, будут использовать ваш загрузчик для поиска других классов, поэтому ваш загрузчик должен предоставить их (путем делегирования родителю)

person ankon    schedule 30.10.2009

Constructor.newInstance работает с экземпляром Constructor, принадлежащим конкретному экземпляру Class, загруженному конкретным ClassLoader. Классы связываются через собственный загрузчик классов.

Single-arg Class.forName использует загрузчик класса непосредственного вызывающего объекта (это очень непослушный API).

person Tom Hawtin - tackline    schedule 30.10.2009