Хитрое поведение компилятора - PullRequest
1 голос
/ 23 марта 2010

Простой фрагмент кода Java.У него есть три класса.После компиляции кода удалите A.class, а затем выполните код.Код по-прежнему работает, почему он не проверяет, существует ли байтовый код A или нет?

class A {
    static {
        System.out.println("In the class A");
    }

    public A() {
    }
}

class B {
    private A a = null;

    static {
        System.out.println("In the class B");
    }

    public B() {
        a = new A();
    }
}

public class ExampleLinkage {
    static {
        System.out.println("In the class A");
    }

    public ExampleLinkage(String str) {
    }

    public static void main(String args[]) {
        try {
            System.out.println("In the main method of ExampleLinkage");
            Class.forName("com.bt.rtti.B");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

Ответы [ 4 ]

5 голосов
/ 23 марта 2010

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

JVM очень ленив, когда загружает классы. он загружает их либо при создании экземпляра объекта этого класса (в первый раз), когда вы явно загружаете класс с помощью Class.forName (), либо когда вы ссылаетесь на класс таким способом, который требует от него информации (попробуйте получить доступ к статический член A из статического инициализатора B и видеть, что A будет загружен.

1 голос
/ 23 марта 2010

Поскольку вы не перекомпилируете его, просто запустите класс.

0 голосов
/ 23 марта 2010

В дополнение к ответу Гордона, вы только запускаете класс, и класс A не требуется, если вы вызываете конструктор A или ссылаетесь на статическое поле или метод в A, тогда вы получите ClassNotFoundException, который вы ожидаете

0 голосов
/ 23 марта 2010

Класс A не используется в коде (т. Е. В основном методе).

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

Попробуйте создать экземпляр B (для которого требуется экземпляр A), тогда вы получите ошибку.

...