Почему этот файл класса создается? - PullRequest
3 голосов
/ 07 марта 2011

В Java все классы загружаются в JVM динамически при первом использовании класса.

Означает ли это, что если у меня есть класс в моем исходном файле, и я не делаю ссылки на него, то его Class объект не создается (т.е. .class файл не создается)?

В приведенном ниже примере кода я не делаю ссылку на класс test3, но все равно создается его объект класса.

class test1 {
    static {
        System.out.println("static block of test1");
    }
}   
class test2{
    static {
        System.out.println("static block of test2");
    }
}
class test3 {}
class MyExample1 {
    public static void main(String ...strings ) {
    new test1();
    new test2();
    }
}

Почему файл test3.class создается?

Ответы [ 2 ]

6 голосов
/ 07 марта 2011
Файл

.class был создан во время компиляции . Но он будет загружен из файла .class при первом использовании (вероятно).

Откуда он должен быть загружен без .class файла?)

1 голос
/ 07 марта 2011

Необходимо различать файл test3.class (созданный компилятором) и объект класса test3.class класса test3, созданный в время выполнения, когда класс загружается загрузчиком классов.

Файл класса всегда создается, если вы компилируете исходный файл .java (модуль компиляции) с классом в нем (чаще всего class3.java, но его также можно назвать любым другим, если класс не является общедоступным) - или косвенно, если этот класс используется другим скомпилированным классом.

Объект класса создается загрузчиком классов при первой загрузке класса - это происходит всякий раз, когда это необходимо, или ранее. Обычный URLClassLoader загружает ваш класс из файла с тем же именем, но в принципе данные также могут быть сгенерированы на лету, загружены из базы данных или аналогичными. Затем он (класс) инициализируется путем вызова блоков static. (Инициализация - это второй шаг, не обязательно в одно и то же время, но оба выполняются до вашего первого использования класса.)

...