实现自己的类加载时 重写方法loadClass与findClass的区别

本文介绍了Java类加载器的工作原理,包括启动类加载器、扩展类加载器和应用程序类加载器。文章讨论了如何通过重写`loadClass`和`findClass`方法实现自定义类加载器,以及这两种方式在双亲委派模型中的不同作用。重写`loadClass`可能导致相同全限定名的类在不同加载器中加载,而重写`findClass`则符合双亲委派模型,防止类重复加载。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

    Java中的类加载器,有启动类加载器(Bootstrap Classloader)、扩展类加载器(Launcher$ExtClassLoader)、应用程序类加载器(Launcher$AppClassLoader),用户还可以实现自定义的类加载器,见下图:

 

    类加载的这种关系称为双亲委派模式,需要注意的是他们之间不是继承关系,而是组合关系,在执行类加载的动作时,首先都是交给父类去加载,如果父类无法加载再交给子类去完成,直到调用用户自定义的类加载器去加载,如果全部都无法加载,就会抛出ClassNotFoundException。

    Launcher$ExtClassLoader和Launcher$AppClassLoader都是URLClassLoader的子类,但是他们的实现又是有一点不同的,Launcher$ExtClassLoader的实现是遵循的双亲委派模型,它重写的是findClass方法,如下:

protected Class findClass(String paramString) throws ClassNotFoundException {    DownloadManager.getBootClassPathEntryForClass(paramString);    return super.findClass(paramString);}
    而 Launcher$AppClassLoader 的实现是没有遵循双亲委派模型的,它重的是 loadClass 方法,以下是 AppClassLoader 中的 loadClass 的源码:
public synchronized Class loadClass(String paramString, boolean paramBoolean) throws ClassNotFoundException {    DownloadManager.getBootClassPathEntryForClass(paramString);    int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值