2016-09-16 7 views
0

Я пытаюсь понять, почему JVM решает загрузить определенные классы, когда это не кажется необходимым. Рассмотрим следующий пример кода:Почему Java ClassLoader загружает этот класс

public class Foo { 
    public void foo() { 
    } 

    static class Bar { 
    } 

    public Bar bar() { 
     return new Bar(); 
    } 
} 

При вызове new Foo().foo(), Bar не нагруженный загрузчиком классов, так как он не нужен. Но, если мы изменим пример, чтобы bar вернуть экземпляр суб-класса:

public class Foo {  
    public void foo() { 
    } 

    static class Bar { 
    } 

    static class BigBar extends Bar { 
    } 

    public Bar bar() { 
     return new BigBar(); 
    } 
} 

Вызов new Foo().foo() вызывает загрузчик классов загрузить оба Bar и BigBar классы, хотя ни один из них необходимы. Зачем?

Помимо этого конкретного сценария, есть ли способ узнать, почему JVM решает, что ему нужно загрузить класс в целом?

+0

Ваш вопрос загадочный. Если у вас JDK8, JDK8 будет использоваться. Вы не можете одновременно использовать 2 JDK. –

+0

Вы скомпилировали код с '-target 1.7' и проверили, как он работает на 7-й версии JRE? Это было бы более прямым способом увидеть, как он обрабатывается, а не гадать, что делает загрузчик классов. – Kayaman

+1

@JoshStone Какой код? Какие классы? «Некоторый код пытается загрузить некоторые классы из Java 8» не дает много работы. – Kayaman

ответ

1

Вот хорошее чтение из Internals of Java Class Loading

Всякий раз, когда новая JVM запускается командой Java MyMainClass, то «самозагрузки загрузчик классов» отвечает за загрузку ключевых Java классов как java.lang.Object и другой код времени выполнения в память. Классы среды выполнения упакованы внутри JRE \ lib \ rt.jar. We не может найти информацию о загрузчике класса загрузки в документации Java , так как это естественная реализация. Для той же причины поведение загрузчика класса загрузки также будет отличаться от через JVM.

В родственном ноте, мы получим пустое значение, если мы пытаемся получить загрузчик классов класса во время выполнения ядра Java, например:

log(java.lang.String.class.getClassLoader()); 

Далее идет класс расширение загрузчика Java. Мы можем хранить библиотеки расширения , которые предоставляют функции, выходящие за пределы ядра Java кода времени выполнения, в пути, заданном свойством java.ext.dirs. ExtClassLoader отвечает за загрузку всех файлов .jar, хранящихся в пути java.ext.dirs . Разработчик может добавить свое собственное приложение .jar файлы или любые другие библиотеки, которые ему или ей может понадобиться добавить в путь класса к этому каталогу расширений, чтобы они были загружены загрузчиком класса расширения.

Третий и самый важный загрузчик классов от разработчика Перспектива - это AppClassLoader. Загрузочный класс приложения - , отвечающий за загрузку всех классов, хранящихся в пути , соответствующих свойству java.class.path.

+0

Я знаком с загрузкой классов в целом. Мне нужно научиться тому, что запускает класс для загрузки в этом точном сценарии, потому что это не очевидно. –

0

хорошо объяснил http://javarevisited.blogspot.in/2012/07/when-class-loading-initialization-java-example.html

Когда класс загружен в Java загрузки класса осуществляются загрузчиками классов в Java, которые могут быть реализованы с нетерпением загрузить класс, как только еще ссылки класса он или ленивые нагрузки класса до возникает необходимость инициализации класса. Если класс загружен до его фактического использования, он может сидеть внутри перед инициализацией. Я считаю, что это может варьироваться от JVM до JVM. Несмотря на то, что JLS гарантирует, что класс будет загружен, когда потребуется статическая инициализация. Когда класс инициализируется в Java 1) Экземпляр класса создается с использованием либо нового() ключевого слова, либо с помощью отражения с использованием класса.forName(), которое может вызывать ClassNotFoundException в Java.

2) вызывается статический метод класса. 3) назначено статическое поле класса. 4) используется статическое поле класса, которое не является постоянной переменной. 5) если класс является классом верхнего уровня и выполняется оператор утверждения, лексически вложенный в класс.

+0

Вы прочитали вопрос? Класс загружается до его ссылки или использования. Согласно опубликованной вами ссылке, класс не должен загружаться. –

Смежные вопросы