Может ли класс Java System Loader действительно быть заменен?
В Java есть свойство для предположительной замены загрузчика системного класса
-Djava.system.class.loader
Однако любой класс, созданный с использованием new , а не .newInstance (), показывает AppClassLoader в качестве загрузчика классов.
AppClassLoader также известен как системный загрузчик классов, поэтому не похоже, что происходит настоящая замена.
Например, при запуске (Oracle Hotspot в Windows JDK 1.8)
// Run with java -Djava.system.class.loader=classLoaders.MyClassLoader
public class MyClassLoader extends ClassLoader {
public MyClassLoader(ClassLoader parent) {
super(parent);
}
@Override
public Class loadClass(String name) throws ClassNotFoundException {
System.out.println("Loading class :" + name);
return super.loadClass(name);
}
};
class A
{
}
public class Example {
public static void main(String[] args) throws Exception {
System.out.println(ClassLoader.getSystemClassLoader());
System.out.println(new Example().getClass().getClassLoader());
System.out.println(new A().getClass().getClassLoader());
}
}
Выход
Класс загрузки: classLoaders. Пример
classLoaders.MyClassLoader@6d06d69c
sun.misc.Launcher$AppClassLoader@58644d46
sun.misc.Launcher$AppClassLoader@58644d46
Пока первый экземпляр Example загружается MyClassLoader, а функция GetSystemClassLoader возвращает MyClassLoader, любой класс, созданный с помощью new , загружается исходным загрузчиком системных классов, так что именно заменяется?