findClass (String) будет вызываться методом loadClass (String) загрузчика классов.Реализация по умолчанию создает исключение ClassNotFoundException и предназначена для переопределения загрузчиками классов.
Метод loadClass (String) будет вызывать следующие методы в указанном порядке
- Сначала он пытается найти, есликласс уже загружен:
findLoadedClass(String)
- Затем, если он не найден, он вызывает родительский метод classloaders
loadClass(String)
. - Если не найден, он вызовет метод
findClass(String)
(пользовательская загрузка)
Таким образом, все, что должен сделать пользовательский загрузчик классов, это переопределить метод findClass(String)
для загрузки классов пользовательским способом.Это обеспечит правильное делегирование при загрузке классов.Проверьте ссылки (javadoc), он объясняет, какие шаги предпринимаются и как findClass(String)
вызывается из loadClass(String)
Так что загрузка классов происходит в следующем порядке (пример) ClassLoader A с родителем B (только объяснениеfindClass и loadClass)
A.loadClass()
|
(not-found?) (by findLoadedClass)
|
B.loadClass()
|
(not found?) (by findLoadedClass)
|
systemclassloader.loadClass() (Bs parent, also can be
| called classpath classloader)
|
(not found?) (by findLoadedClass)
|
bootstrap classloader.loadClass() (the bootstrap classloader,
| this has no parent)
|
(not found?)
|
systemclassloader.findClass() (on system classloader,
| will try to "find" class in "classpath")
|
(not found?)
|
B.findClass()
|
(not found?)
|
A.findClass()
|
(not found?)
|
ClassNotFoundException
В любой момент времени, если класс найден (например, findClass или findLoadedClass), этот класс возвращается.