我熟悉Java异常的基本结构,但是我第一次注意到Class.forName堆栈跟踪的奇怪之处:</ p>
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:195)
...
java.lang.Thread.run(Thread.java:745)
为什么提到了两个forName实例,零代表什么?这是堆栈跟踪如何表示具有不同签名的多个同名方法吗?
答案 0 :(得分:5)
请注意,此方法的源代码的可见性标记为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
abandons this convention并使用Internal
标记代替内部方法。
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}