gpt4 book ai didi

java - findClass 的控制流是怎样的

转载 作者:搜寻专家 更新时间:2023-11-01 04:05:14 31 4
gpt4 key购买 nike

在用于加载类的双亲委派模型中,我知道 loadclass() 是在父级上调用的,一直调用到类加载器层次结构的顶部(假设该类未加载)。此时最顶层父类加载器的 findClass 被调用。 如果没有找到这个类,控制权如何转移到下一个类加载器的 findClass 方法?

最佳答案

findClass(String)将由 loadClass(String) 调用类加载器的方法。这是默认的实现抛出 ClassNotFoundException 并打算被类加载器覆盖。

loadClass(String) 方法将按顺序调用以下方法

  • 首先它会尝试查找类是否已经加载:findLoadedClass(String)
  • 然后,如果没有找到,它会调用父类加载器的 loadClass(String) 方法。
  • 如果没有找到,会调用findClass(String)方法(自定义加载)

因此,自定义类加载器所要做的就是覆盖 findClass(String) 方法以自定义方式加载类。这将确保类加载中的正确委托(delegate)。检查链接 (javadoc),它解释了采取的步骤以及如何从 loadClass(String)

调用 findClass(String)

因此类加载按以下顺序进行(示例)ClassLoader A with parent B(只解释findClass和loadClass)

               A.loadClass()
|
(not-found?) (by findLoadedClass)
|
B.loadClass()
|
(not found?) (by findLoadedClass)
|
systemclassloader.loadClass() (Bs parent, also can be
| called classpath classloader)
|
(not found?) (by findLoadedClass)
|
bootstrap classloader.loadClass() (the bootstrap classloader,
| this has no parent)
|
(not found?)
|
systemclassloader.findClass() (on system classloader,
| will try to "find" class in "classpath")
|
(not found?)
|
B.findClass()
|
(not found?)
|
A.findClass()
|
(not found?)
|
ClassNotFoundException

在任何给定时间,如果找到该类(通过 findClass 或 findLoadedClass),则返回该类。

关于java - findClass 的控制流是怎样的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3544614/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com