【问题标题】:Why Class.forName("BumpTest"), not BumpTest.class?为什么是 Class.forName("BumpTest"),而不是 BumpTest.class?
【发布时间】:2017-10-31 20:47:58
【问题描述】:

JLS Sec 8.4.3.6, synchronized methods 中,它说:

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.classBumpTest 不可能没有加载,毕竟它正在执行该类的代码。并且按原样写,检查的ClassNotFoundException必须被抓住并吞下。

这样写有什么特别的原因吗?

【问题讨论】:

  • 也许这个例子早于类文字。我不确定何时引入了类文字。
  • 基本上,您是说如果您只使用BumpTest.class 而不是Class.forName?你试过了吗?也许他们的榜样不是最好的
  • @user2357112 你可能是对的:这个例子在the Java 1.0 spec,但没有提到类文字。如果您将其添加为答案,我会接受。

标签: java language-specifications


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-12
    • 2011-10-08
    • 2011-12-01
    • 1970-01-01
    • 2015-01-04
    • 2010-12-12
    • 2010-10-11
    相关资源
    最近更新 更多