在用于加载类的父级委托模型中,我知道loadclass()是在父级上调用的,一直到类加载器层次结构的顶部(假设未加载类)。此时将调用最顶层的父类加载器的findClass。
如果找不到此类,则如何将控件转移到下一个类加载器的findClass方法?

最佳答案

findClass(String)将由类加载器的loadClass(String)方法调用。是默认的
实现会引发ClassNotFoundException,并且打算由classloader重写。

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

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

  • 因此,自定义类加载器所要做的就是重写findClass(String)方法以自定义方式加载类。这将确保在类加载中进行适当的委派。检查链接(javadoc),它说明了采取的步骤以及如何从findClass(String)调用loadClass(String)
    因此,类加载按以下顺序进行(示例)
    具有父级B的ClassLoader A(仅解释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进行查找),则返回该类。

    08-27 13:38