Почему 0 представляет в 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 и что представляет ноль? Это как стековые трассировки представляют несколько методов с одним и тем же именем с разными сигнатурами?

1 ответ

Решение

Обратите внимание, что исходный код этого метода имеет видимость, помеченную как 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;

Это означает, что этот класс не предназначен для того, чтобы быть частью общедоступного API и не является чем-то, что вы, простой смертный, должны вызывать напрямую.

Почему ноль? Это просто соглашение об именах. Также было бы странно, если бы он был перегружен forName так как это не предназначено для использования вне этого конкретного класса.

Это соглашение об именах не связано и не связано с библиотеками Java; вы можете использовать любое имя, которое вы хотите описать своим внутренним, непубличным API.

В качестве примера, ArrayList отказывается от этой конвенции и использует Internal маркер вместо внутреннего метода.

private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
Другие вопросы по тегам