Добрый день! Реализовал свой собственный загрузчик, переопределив findClass(..). Загрузка происходит без ошибок.Но если системный загрузчик обнаружит в classpath валидный класс, то и загрузит его.Мой кастомный find() вызван не будет! Можно ли это как-то избежать, что бы загружать классы по-своему. даже если они есть в classpath ?
Ответ
Так работают загрузчики в jvm. Сначала вызывается родительский загрузчик и только если он не найдет класс то дочерний загрузчик будет искать класс сам.
Надо переопределить loadClass(String, boolean) и для тех класов, которые должны быть загружены данным загрузчиком самому вызывать findClass, а для остальных использовать существующукю схему.
protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
if (name.startsWith("myspecificclasspackage")) {
Class c = findLoadedClass(name);
c = c == null ? findClass(name) : c;
if (resolve) {
resolve(c);
}
return c;
}
return super.loadClass(name, resolve);
}
}
Комментариев нет:
Отправить комментарий