Я был смущен иерархией делегирования UrlClassLoader и иерархией наследования.
Я создал класс, который расширяет UrlClassLoader и выполняется: childOfUrlClassLoader.getParent().getClass().getName()
который дал мне:
sun.misc.Launcher$AppClassLoader
.
После этого я посещу упомянутый выше класс (источник)
249 static class AppClassLoader extends URLClassLoader {
//...
308 protected synchronized Class<?> loadClass(String name, boolean resolve)
309 throws ClassNotFoundException
310 {
311 // First, check if the class has already been loaded
312 Class c = findLoadedClass(name);
313 if (c == null) {
314 try {
315 if (parent != null) {
316 c = parent.loadClass(name, false);
317
// ...
329 return c;
330 }
Затем я проверил, кто является родителем AppClassLoader. Ожидается, что я получил sun.misc.Launcher$ExtClassLoader
, а родительский элемент ExtClassLoader - null
.
У меня есть несколько вопросов:
1) Кто загружает мой класс, так как код AppClassLoader.loadClass
имеет строку
294 return (super.loadClass(name, resolve));
Это похоже на цикл, не так ли?
2) Почему ExtClassLoader не имеет BootstrapClassLoader
как родителя, но имеет null
?
3) Для чего класс AppClassLoader расширяет UrlClassLoader?