Какой класс загрузчик используется?
У меня есть несколько вопросов, касающихся загрузчиков классов.
Class.forName("class.name");
а также
....
NotYetLoadedClass cls = new NotYetLoadedClass();
.....
Какие загрузчики классов будут использоваться в каждом случае? В первом случае я предполагаю, что загрузчик классов использовался для загрузки класса, в котором выполняется код метода. А во втором случае я предполагаю загрузчик класса контекста потока.
В случае, если я не прав, небольшое объяснение приветствуется.
1 ответ
Оба используют текущий ClassLoader
, Как правильно указывает ДНК, http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html утверждает, что Class.forName()
использует текущий загрузчик классов. Небольшой эксперимент показывает, что класс, загруженный для реализации с использованием new
Заявление также использует текущий ClassLoader
:
public class Test
{
public static void main(String[] args) throws Exception
{
Thread.currentThread().setContextClassLoader(new MyClassLoader());
SomeClass someClass = new SomeClass();
someClass.printClassLoader();
}
public static class MyClassLoader extends ClassLoader
{
public MyClassLoader()
{
super();
}
public MyClassLoader(ClassLoader parent)
{
super(parent);
}
}
}
public class SomeClass
{
public void printClassLoader()
{
System.out.println(this.getClass().getClassLoader());
System.out.println(Thread.currentThread().getContextClassLoader());
}
}
В Test
мы устанавливаем текущий поток ContextClassLoader на некоторые пользовательские ClassLoader
а затем создать экземпляр объекта класса SomeClass
, В SomeClass
мы распечатываем ContextClassLoader текущего потока и ClassLoader
который загрузил класс этого объекта. Результат
sun.misc.Launcher$AppClassLoader@3326b249
test.Test$MyClassLoader@3d4b7453
показывая, что текущий ClassLoader
(sun.misc.Launcher.AppClassLoader
) был использован для загрузки класса.