如何控制流到findClass

unm*_*upt 3 java delegation classloader

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

nai*_*kus 12

所述的findClass(字符串)将由被调用的loadClass(字符串)类加载器的方法.它的默认实现抛出ClassNotFoundException,并且打算被类加载器覆盖.

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

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

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

因此,类加载按以下顺序进行(示例)ClassLoader A与父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
Run Code Online (Sandbox Code Playgroud)

在任何给定的时间,如果找到该类(由findClass或findLoadedClass),则返回该类.