6

JLS Sec 8.4.3.6, synchronizedmethods中,它说:

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必须被抓住并吞下。

以这种方式写它有什么特别的原因吗?

4

1 回答 1

3

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

于 2017-10-31T21:13:34.970 回答