为什么是 Class.forName("BumpTest"),而不是 BumpTest.class?

Why Class.forName("BumpTest"), not BumpTest.class?

JLS Sec 8.4.3.6, synchronized methods中说:

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

has exactly the same effect as:

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

这对我来说很奇怪,更不用说过于复杂了:为什么使用 Class.forName("BumpTest") 而不是 BumpTest.classBumpTest 不可能没有加载,因为毕竟它正在执行来自 class 的代码。而且照原样写,checkedClassNotFoundException还得抓着吞

这样写有什么特殊原因吗?

它似乎只是一个非常非常古老的例子,比 class 文字更古老。在引入 class 文字之前,相同的示例出现在 JLS 1.0 中。