问答详情
源自:4-2 核心类MyClassLoader

语句myClassLoader.loadClass(className)中继承自父类方法loadClass内部的奇怪调用

陈述事实:

    教学视频中,MyClassLoade类中loadClass(String name)这个继承自ClassLoader类,该方法内部会调用findClass(String name)方法,而MyClassLoader里已经被覆盖了继承来的findClass(String name)。

描述现象

    在调试时发现,调用myClassLoader.loadClass(className)时,跟踪到父类ClassLoader里loadClass(String name, boolean resolve)中一个语句:c = findClass(name)时,发现调用的竟然不是MyClassLoader的findClass方法,而是URLClassLoader里的findClass方法。

问题:

    请问各位码友,为什么是这样?

上图片:

https://img3.mukewang.com/5d3529930001fc8719201080.jpg

提问者:慕尼黑4561501 2019-07-22 11:12

个回答

  • 慕粉4096830
    2019-08-06 09:38:12

    URLClassLoader是ClassLoader的一个子类,java加载时逐级上传,当前类加载器无法加载时抛给父级加载器,当父级加载器为null时bootstrapclassloader充当父级加载器启动。这里看应该是先传给了URLClassLoader加载器,调用它的findclass。URLClassloader这个是用来安装指定路径加载资源的一个加载类。classloader只能加载classpath下的类。我猜可能是因为代码中给定了要加载类的路径,所以java先传给了URLClassLoader类加载器。如果这个加载器无法加载还会继续传递给父类classloader