Когда classLoader загружает импорт? - PullRequest
10 голосов
/ 23 декабря 2011

Предположим, что у меня есть класс только со статическими методами.Загрузит ли загрузчик классов каждый импортированный класс при загрузке класса в память?Или он будет загружать импорт только тогда, когда метод из этого будет нуждаться в доступе к нему?

Вопрос в том, загружает ли загрузчик классов импорт, когда класс загружается в память, или перед тем, как некоторые методы захотят их использовать.Если это первый вариант, мне, вероятно, потребуется разделить некоторые из моих классов Util , чтобы они были более специализированными .

Ответы [ 3 ]

20 голосов
/ 23 декабря 2011

Я думаю, вы можете проверить это следующим образом:

package pkg1;

public class Test {

    static {
        System.out.println("Hello 111");
    }

    public static void meth() {
        System.out.println("Hello 222");
    }
}

Тест 1:

package pkg2;

import pkg1.Test;

public class Tester {    

    public static void main(String... args) {                   
        Test t;       
    }    
}

Это ничего не печатает.

Тест 2:

package pkg2;

import pkg1.Test;

public class Tester {    

    public static void main(String... args) {                   
        Test.meth();        
    }

}

Печать:

Hello 111
Hello 222

Таким образом, только то, что вы импортировали класс, не означает, что загрузчик классов загрузит класс в память. Он загружает его динамически, когда он используется.

3 голосов
/ 23 декабря 2011

Я не претендую на то, что знаю много о загрузчике классов, но если вы говорите об операторах импорта, загрузчик классов не имеет значения.

Операторы импорта существуют исключительно для того, чтобы позволить разработчику использовать короткие имена классов, а не полное имя каждого класса, на который есть ссылка в написанном классе. Компилятор использует эти операторы импорта очень рано для разрешения имен ссылочных классов до того, как будет создана одна строка байт-кода.

1 голос
/ 23 декабря 2011

Как правило, статический кодовый блок в верхней части файла класса с отчетом (например, оператором печати) даст вам хорошее представление о том, когда загрузка происходит в вашем конкретном приложении.

Однако,при работе с угловыми случаями, такими как динамические классы, внутренние статические классы или классы вне пути к классам, которые динамически загружаются, вам следует быть осторожным - поскольку эти классы могут фактически загружаться в приложение несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...