为什么0代表java.lang.Class.forName0?

Why does the 0 represent in java.lang.Class.forName0?

我熟悉 Java 异常的基本结构,但我第一次注意到 Class.forName 堆栈跟踪的奇怪之处:

java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:195)
...
java.lang.Thread.run(Thread.java:745)

为什么提到两个 forName 实例,零代表什么?堆栈跟踪是这样表示具有不同签名的多个同名方法的吗?

请注意,此方法的源代码的可见性标记为 private

/** Called after security check for system loader access checks have been made. */
private static native Class<?> forName0(String name, boolean initialize,
                                        ClassLoader loader,
                                        Class<?> caller)
    throws ClassNotFoundException;

这意味着这个 class 不打算成为 public-facing API 的一部分,也不是凡人应该直接调用的东西。

为什么是零?这只是一个命名约定。如果它超载 forName 也会看起来很奇怪,因为它不打算在这个特定的 class.

之外使用

此命名约定未绑定或依赖于 Java 的库;你可以使用任何你想描述你内部的名字,non-public API.

例如,ArrayList abandons this convention 并使用 Internal 标记代替内部方法。

private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}