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

本文介绍了Java中类加载器的工作原理,包括启动类加载器、扩展类加载器和应用程序类加载器。讨论了自定义类加载器时重写loadClass和findClass方法的不同之处,以及它们如何影响双亲委派模型。重写loadClass可能导致相同全限定名的类在不同类加载器中加载,适合于插件容器场景;而重写findClass则遵循双亲委派模型,防止类冲突。
摘要由CSDN通过智能技术生成
               

    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 i = paramString.lastIndexOf(46);    if (i != -1) {        SecurityManager localSecurityManager =   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值