Почему 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, до того, как литералы класса были введены.