Почему Class.forName("BumpTest"), а не BumpTest.class?

В JLS Sec 8.4.3.6, synchronized методы, это говорит:

class BumpTest {
    // ...
    static synchronized void classBump() {
        classCount++;
    }
}

имеет точно такой же эффект как:

class BumpTest {
    // ...
    static void classBump() {
        try {
            synchronized (Class.forName("BumpTest")) {
                classCount++;
            }
        } catch (ClassNotFoundException e) {}
    }
}

Это выглядит странно для меня, не говоря уже о слишком сложном: зачем использовать Class.forName("BumpTest") не BumpTest.class? Это не возможно, что BumpTest не загружен, потому что он выполняет код из этого класса, в конце концов. И писать это как есть, проверено ClassNotFoundException должен быть пойман и проглочен.

Есть ли особая причина, чтобы написать это таким образом?

1 ответ

Решение

Кажется, это действительно очень старый пример, более старый, чем классовые литералы. Тот же самый пример появляется в JLS 1.0, до того, как литералы класса были введены.

Другие вопросы по тегам